C# Wie, um mehrere Ausnahmen, die nicht alle gleich?
In meinem code habe ich eine Methode mit mehreren catch-Anweisungen, die führen Sie alle die gleiche Aussage. Ich bin mir nicht sicher, ob dies der richtige Weg, um dies zu implementieren. Wie würden Sie dies tun?
public void LoadControl(ControlDestination controlDestination, string filename, object parameter)
{
try
{
//Get filename with extension
string file = GetControlFileName(filename);
//Check file exists
if (!File.Exists(file))
throw new FileNotFoundException();
//Load control from file
Control control = LoadControl(filename);
//Check control extends BaseForm
if (control is BaseForm)
{
//Set current application on user control
((BaseForm)control).CurrentApplication = this;
((BaseForm)control).Parameter = parameter;
//Set web user control id
control.ID = filename;
Panel currentPanel = null;
switch (controlDestination)
{
case ControlDestination.Base:
//Set current panel to Base Content
currentPanel = pnlBaseContent;
//Set control in viewstate
this.BaseControl = filename;
break;
case ControlDestination.Menu:
//Set current panel to Menu Content
currentPanel = pnlMenuContent;
//Set control in ViewState
this.MenuBaseControl = filename;
break;
}
currentPanel.Controls.Clear();
currentPanel.Controls.Add(control);
UpdateMenuBasePanel();
UpdateBasePanel();
}
else
{
throw new IncorrectInheritanceException();
}
}
catch (FileNotFoundException e)
{
HandleException(e);
}
catch (ArgumentNullException e)
{
HandleException(e);
}
catch (HttpException e)
{
HandleException(e);
}
catch (IncorrectInheritanceException e)
{
HandleException(e);
}
}
Dies ist, wie HandleException aussieht:
private void HandleException(Exception exception)
{
//Load error control which shows big red cross
LoadControl(ControlDestination.Menu, "~/Controls/Error.ascx", null);
//Store error in database
DHS.Core.DhsLogDatabase.WriteError(exception.ToString());
//Show error in errorbox on master
Master.ShowAjaxError(this, new CommandEventArgs("ajaxError", exception.ToString()));
}
- Fang nicht ArgumentNullException, vermeiden Sie es!
- Ich denke, dass dies der Weg würde ich wählen, dies zu tun - ja es ist ein bisschen langatmig, aber Sie sind explizit, was Sie tun, und es ermöglicht es Ihnen, zusätzliche geeignete Schritte auf jeden Fall
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du machst es richtig (Sie fangen sollte nur die Ausnahmen, die Sie gehen zu behandeln, und es keine Möglichkeit gibt, fangen Sie mehr als ein exception-Typ in einem einzigen
catch
block), aber als alternative, können Sie einfachcatch(Exception ex)
, den Typ der Ausnahme prüfen, und wenn es ist nicht eine, die Sie erwarten geradethrow
es wieder, so etwas wie dieses:UPDATE: Mit C# 6 (kommt zusammen mit Visual Studio 2015) Sie sind in der Lage, führen Sie die folgenden stattdessen:
exceptionTypes.Any(type => type.IsAssignableFrom(ex))
statt einem einfachen Vergleich der Geschlechter.Ich würde umgestalten, wie folgt:-
Wenn ich mit VB.NET ich würd exception Filter Reihe von Fängen. Aber da wir mit C#, der Ansatz, Sie haben die effizienteste ist möglich, anstatt
Können Sie Generika für eine viel bessere Lösung, solange es Ihnen nichts ausmacht mit Lambda zu. Ich bin kein fan von ein-geben. Ich habe diesen code ein paar mal, ich finde es kommt in besonders praktisch für Dienst-proxies, in dem Sie möchten, um zu behandeln eine Reihe von Ausnahmen, die in der gleichen Weise. Wie schon oben erwähnt es ist immer am besten fangen Sie die richtige Art von Ausnahme, wo möglich.
Den code durch Angabe der Ausnahmen als generischen Typ-Argumente für den Griff-Funktion. Diese speziellen Typen sind dann gefangen, aber übergeben, um einen generischen handler der Basisklasse. Ich wusste nicht fügen Sie eine HandleAndThrow aber diese können Hinzugefügt werden, wie gewünscht. Auch ändern Sie Benennung, um Ihren wünschen.
Schreiben es so:
edit: beachten Sie, dass dies ist eine direkte Antwort auf Ihre Frage nicht kommentieren, ob oder nicht, dies ist eine empfohlene Praxis.
edit2: du kannst aber testen, in Ihrer Funktion, wenn die Art der
e
ist eine bestimmte Liste von Ausnahmen, und wenn nicht, können Sie rethrow es. Exception handling ist ein nicht-Problem, da es bedeutete, zu sein... außergewöhnlich in den ersten Platz.Werde ich diese zu beantworten ist eine sprachunabhängige Weise:
1.
Was Sie getan haben, ist jetzt korrekt. Nichts falsch mit ihm, außer, dass es vielleicht langweilig werden, wenn Sie es tun, viele Male.2.
Fangen der allgemeinsten form der Ausnahme, dass es ist. Einfach3.
Vielleicht wollen Sie nur fangen einige Ausnahmen, ohne Probleme alle Ausnahmen, das ist, was Sie tun würde, wenn Sie Tat genau #2.Tun, was Sie schon in #2, plus ändern HandleException zu behandeln nur bestimmte Typen von Ausnahmen. Auf diese Weise werden Sie nur überhaupt nichts zu tun haben Typ tem mal raus, und es ist immer noch kompakter als die oben.
Edit:
Sehe ich Konamiman hat eine verbesserte version dieser Dritte option. Ich sagen, gehen dafür.
Ich würde es so machen