2017-07-27 2 views
2

Wenn ich zwei Methoden aufrufen, die die gleichen Ausnahmen nacheinander auslösen können, aber der Grund der Ausnahme ist anders, wie soll ich damit umgehen?Ausnahmebehandlung Best-Practice

Sollte ich einen Versuch catch Block um jede dieser Methoden, so dass ich beide Ausnahmen auf eine andere Weise behandeln kann oder wie ich die Methode, die die Ausnahme löst, erhalten?

Als Beispiel: Ich habe diese Methode

dir = Directory.CreateDirectory(Path.Combine(My.Settings.CalibrationExcelExportPath, dirName)) 

Verfahren ein IOexception werfen kann.

Als nächstes rufe ich eine Methode ExcelExport.ExportCalibrationAsync, die eine TempFile erstellt, die auch eine IOexception werfen kann, wenn zum Beispiel keine Tempnamen mehr frei sind.

Jetzt möchte ich die Ausnahme in einem Diff behandeln. Möglichkeit, dem Benutzer die richtigen Informationen zu geben.

Ich habe mit exception.TargetSite versucht, aber ich bekomme beide Male Void WinIOError(Int..), also kann ich das nicht zur Unterscheidung verwenden.

Was ist die beste Praxis hier

Antwort

3

Es gibt zwei Möglichkeiten, wie ich zu tun darüber reden werde. Eine ist, Ihre Try...Catch Blöcke zu verschachteln. Aber ich würde die zweite empfehlen, die ich unten beschrieben habe.

Meine Annahme hier ist, dass dir einen Wert hat, wenn der Anruf, den Sie angaben, erfolgreich ist, und wenn nicht, wird es Nothing sein. Wenn das der Fall ist, können Sie Ihre Exception-Handler selektiv wie folgt vorgehen:

Try 
    dir = Directory.CreateDirectory(Path.Combine(My.Settings.CalibrationExcelExportPath, dirName)) 
    ' Other code here that might throw the same exception. 
Catch ex As IOException When dir Is Nothing 
    ' Do what you need when the call to CreateDirectory has failed. 
Catch ex As IOException When dir Is Not Nothing 
    ' For the other one. You can leave the when out in this instance 
Catch ex As Exception 
    ' You still need to handle others that might come up. 
End Try 
2

Ich würde vorschlagen, dass Sie Ihre benutzerdefinierten Ausnahmen erstellen, weil Ihr Call-Stack tief sein kann, und Sie können einen Handler in verschiedenen Verfahren haben aus der, von dem die Ausnahme kommt.

Try 
    dir = Directory.CreateDirectory(Path.Combine(My.Settings.CalibrationExcelExportPath, dirName 
Catch ex As Exception 
    Throw New CreateDirectoryException("An exception has occurred when creating a directory.", ex) 
End Try 

Try 
    ' Other code causing exception here 
Catch ex As Exception 
    Throw New AnotherException("An exception has occurred.", ex) 
End Try 

als schaffen, was Handler Sie für CreateDirectoryException und AnotherException.