BEARBEITEN: Ich stimme anderen zu, die sagen, dass Ausnahmefilter ab C # 6.0 jetzt ein perfekter Weg sind:catch (Exception ex) when (ex is ... || ex is ... )
Abgesehen davon, dass ich das einzeilige Layout immer noch hasse und den Code persönlich wie folgt auslegen würde. Ich denke, dies ist ebenso funktional wie ästhetisch, da ich glaube, dass es das Verständnis verbessert. Einige mögen anderer Meinung sein:
catch (Exception ex) when (
ex is ...
|| ex is ...
|| ex is ...
)
ORIGINAL:
Ich weiß, ich bin ein bisschen zu spät zur Party hier, aber heiliger Rauch ...
Auf den Punkt gebracht, dupliziert diese Art eine frühere Antwort. Wenn Sie jedoch wirklich eine gemeinsame Aktion für mehrere Ausnahmetypen ausführen und das Ganze im Rahmen der einen Methode ordentlich und ordentlich halten möchten, verwenden Sie doch einfach ein Lambda / Closure / Inline-Funktion, um Folgendes zu tun? Ich meine, die Chancen stehen gut, dass Sie am Ende erkennen, dass Sie diesen Verschluss nur zu einer separaten Methode machen möchten, die Sie überall anwenden können. Aber dann wird es super einfach sein, dies zu tun, ohne den Rest des Codes strukturell zu ändern. Recht?
private void TestMethod ()
{
Action<Exception> errorHandler = ( ex ) => {
// write to a log, whatever...
};
try
{
// try some stuff
}
catch ( FormatException ex ) { errorHandler ( ex ); }
catch ( OverflowException ex ) { errorHandler ( ex ); }
catch ( ArgumentNullException ex ) { errorHandler ( ex ); }
}
Ich kann nicht anders, als mich zu fragen ( Warnung: ein wenig Ironie / Sarkasmus voraus), warum um alles in der Welt all diese Anstrengungen unternommen werden, um im Grunde nur Folgendes zu ersetzen:
try
{
// try some stuff
}
catch( FormatException ex ){}
catch( OverflowException ex ){}
catch( ArgumentNullException ex ){}
... mit einer verrückten Variation dieses nächsten Codegeruchs, meine ich zum Beispiel, nur um so zu tun, als würden Sie ein paar Tastenanschläge speichern.
// sorta sucks, let's be honest...
try
{
// try some stuff
}
catch( Exception ex )
{
if (ex is FormatException ||
ex is OverflowException ||
ex is ArgumentNullException)
{
// write to a log, whatever...
return;
}
throw;
}
Weil es sicherlich nicht automatisch besser lesbar ist.
Zugegeben, ich habe die drei identischen Instanzen /* write to a log, whatever... */ return;
aus dem ersten Beispiel herausgelassen.
Aber das ist irgendwie mein Punkt. Sie haben schon von Funktionen / Methoden gehört, oder? Ernsthaft. Schreiben Sie eine gemeinsame ErrorHandler
Funktion und rufen Sie sie von jedem catch-Block aus auf.
Wenn Sie mich fragen, ist das zweite Beispiel (mit den Schlüsselwörtern if
und is
) sowohl deutlich weniger lesbar als auch gleichzeitig während der Wartungsphase Ihres Projekts wesentlich fehleranfälliger.
Die Wartungsphase für alle, die noch relativ neu in der Programmierung sind, wird 98,7% oder mehr der gesamten Lebensdauer Ihres Projekts ausmachen, und der arme Trottel, der die Wartung durchführt, wird mit ziemlicher Sicherheit jemand anderes als Sie sein. Und es besteht eine sehr gute Chance, dass sie 50% ihrer Zeit damit verbringen, Ihren Namen zu verfluchen.
Und natürlich bellt FxCop Sie an, und deshalb müssen Sie Ihrem Code auch ein Attribut hinzufügen, das genau mit dem laufenden Programm zu tun hat und nur dazu dient, FxCop anzuweisen, ein Problem zu ignorieren, das in 99,9% der Fälle vollständig auftritt richtig in der Kennzeichnung. Tut mir leid, ich könnte mich irren, aber wird dieses Attribut "Ignorieren" nicht tatsächlich in Ihre App kompiliert?
Würde if
es besser lesbar sein , den gesamten Test in eine Zeile zu setzen? Das glaube ich nicht. Ich meine, ich hatte vor langer Zeit einen anderen Programmierer, der vehement argumentierte, dass mehr Code in eine Zeile "schneller laufen" würde. Aber natürlich war er total verrückt. Der Versuch, ihm (mit ernstem Gesicht - was eine Herausforderung war) zu erklären, wie der Interpreter oder Compiler diese lange Zeile in diskrete Anweisungen mit einer Anweisung pro Zeile zerlegen würde - im Wesentlichen identisch mit dem Ergebnis, wenn er fortgefahren wäre und Ich habe nur den Code lesbar gemacht, anstatt zu versuchen, den Compiler zu überlisten - hatte keinerlei Auswirkungen auf ihn. Aber ich schweife ab.
Wie viel weniger lesbar wird dies, wenn Sie in ein oder zwei Monaten drei weitere Ausnahmetypen hinzufügen? (Antwort: es wird viel weniger lesbar).
Einer der wichtigsten Punkte ist, dass der größte Teil der Formatierung des Textquellcodes, den wir uns jeden Tag ansehen, darin besteht, anderen Menschen wirklich, wirklich klar zu machen, was tatsächlich passiert, wenn der Code ausgeführt wird. Weil der Compiler den Quellcode in etwas völlig anderes verwandelt und sich nicht weniger um Ihren Code-Formatierungsstil kümmert. All-on-One-Line ist also auch total beschissen.
Ich sage nur ...
// super sucks...
catch( Exception ex )
{
if ( ex is FormatException || ex is OverflowException || ex is ArgumentNullException )
{
// write to a log, whatever...
return;
}
throw;
}