2017-02-14 2 views
-1

So habe ich während meines ersten Projekts, das C# lernt, einige Try/Catch-Blöcke benutzt. Zum größten Teil haben sie gut funktioniert. Es gibt jedoch ein Paar, bei dem der Code trotz der Tatsache, dass er den genauen Ausnahmetyp findet, den ich erwartet und erhofft habe, immernoch bricht. Ich werde ein Beispiel für Code angeben, bei dem dieses Problem auftritt.Ausnahmen fangen nicht mit Catch-Block. Warum?

Hier ist, wo ich versuche, die Ausnahme zu fangen:

app.MoveFolder(input1, input2); 

       try 
       { 
        //code here 
       } 
       catch(ArgumentException) 
       { 
        //code here 
       } 
       break; 

Hier ist die Funktion, wo ich die Ausnahme erstellen:

public void MoveFolder(string folderPath, string newLocation) 
    { 
     this.ThrowExceptionIfFolderDoesntExist(folderPath); 

     if (Directory.Exists(newLocation) == true) 
     { 
      throw new ArgumentException("pls wrk"); 
     } 
     Directory.Move(folderPath, newLocation); 
    } 

Die 'ThrowExceptionIfFolderDoesntExist()' Funktion führt dies:

Also, wie Sie sehen können, sowohl diese und die if-Anweisung in meiner MoveFolder() -Funktion sollte ArgumentExceptions zurückgeben, von denen ich gehofft hatte, sie zu erfassen. Im Falle der letzteren Funktion funktioniert das wie beabsichtigt. Allerdings, wenn ich versuche, einen Ordner an einen Speicherort zu verschieben, die bereits vorhanden ist, dann erhalte ich das folgende:

Unhandled Exception: System.ArgumentException: pls wrk 

Das ist nicht, was ich will, wie ich den catch-Block behandeln dieses besondere Argument auch will . Hat das etwas mit dem Catch-Block zu tun, denke ich, dass ich mich auf eine spezielle Argument-Ausnahme beziehe? Ich hätte gedacht, dass es sich auf alle ArgumentExceptions beziehen würde.

Wie kann ich dieses Problem lösen?

Danke.

+2

Nun, der Aufruf von MoveFolder befindet sich nicht im try Block, warum erwarten Sie, die Ausnahme zu fangen? – Steve

+1

Das Objekt, das die Ausnahme (MoveFolder) auslöst, existiert außerhalb des try-catch-Blocks. Verschiebe app.MoveFolder (input1, input2) in den try Block –

+1

'app.MoveFolder (input1, input2); 'muss in dem' try' sein ... Wo dein erster '// code here' Kommentar ist – pinkfloydx33

Antwort

3

Um eine ordnungsgemäße try/catch zu tun, müssen Sie Folgendes tun:

  1. Platzieren Sie Ihre Methode in der try Block
  2. catch die Exception(s)
  3. throw die Exception

Hier ist ein Code

try 
{ 
    app.MoveFolder(input1, input2); 
} 
// catch ArgumentException 
catch(ArgumentException ex) 
{ 
    throw; 
} 
// catch all others 
catch(Exception ex) 
{ 
    throw; 
} 
+0

auf diese Weise gehen der Stacktrace und mögliche innere Ausnahmen verloren.Wenn Sie beabsichtigen, die Ausnahme auf die nächste Ebene zu werfen, verwenden Sie einfach "throw", ohne eine neue Ausnahme zu erstellen. –

+0

@MongZhu - Sie haben Recht, ich habe es korrigiert. – Svek

+0

Aha! Aus irgendeinem Grund hatte ich beschlossen, Funktionen außerhalb des catch-Blocks zu platzieren, weil ich dachte, dass die Funktion zuerst ausgeführt werden musste, damit die Ausnahme angezeigt würde, BEVOR sie entweder try oder catch erreichte. Das beantwortet meine Frage schön, vielen Dank! – jamessct

0

Um eine Ausnahme einzufangen, die von einer Funktion ausgelöst wird, muss die Funktion in Try {} aufgerufen werden. Sie können wie die anderen sagen und den MoveFolder in einem Try Block aufrufen. Wenn Sie eine Ausnahme außerhalb des Try-Blocks werfen, kann sie manchmal von anderen catch-Blöcken oder einfach nicht behandelt werden und einen Fehler verursachen.

try 
{ 
    app.MoveFolder(Something1, Something2); 

} catch {ArgumentException) { 

//Do something with Exception 
} 
+0

Ich wählte die andere Antwort, wie er zuerst da war, aber cheers beantwortet meine Frage :) – jamessct