Autor |
Beitrag |
Ritzeratze
      
Beiträge: 101
|
Verfasst: Do 29.05.14 09:29
Moin,
ich habe eine Verständnisfrage:
Wenn in einem try-Block mehrere Exception Handler definiert sind, wie (in welcher Reihenfolge) werden diese Execption Handler abgearbeitet?
Prinzipiell werden Exceptions doch dort abgearbeitet wo sie auftreten.
Gruss
Ritze
|
|
Yankyy02
      
Beiträge: 138
Erhaltene Danke: 21
Win 11 x64
C# (VS 2022 - Rider)
|
Verfasst: Do 29.05.14 09:51
Hallo Ritzeratze,
folgender Link sollte deine Frage beantworten besonders Punkt 7.1.4 openbook.galileocomp...42-9252-46f4cd23489f
MfG
Gery
_________________ the quiter you become, the more you are able to hear
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 29.05.14 09:53
Es wird der erste passende benutzt, sprich speziellere Exceptionklassen müssen immer vor ihren Vorfahren stehen, der Compiler prüft das. Siehe Doku:
msdn.microsoft.com/d...ibrary/0yd65esw.aspx hat folgendes geschrieben: | It is possible to use more than one specific catch clause in the same try-catch statement. In this case, the order of the catch clauses is important because the catch clauses are examined in order. Catch the more specific exceptions before the less specific ones. The compiler produces an error if you order your catch blocks so that a later block can never be reached. |
Das gilt für Delphi z.B. genauso, wird dort aber nicht vom Compiler abgefangen.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 29.05.14 14:56
Zitat: | Wenn in einem try-Block mehrere Exception Handler definiert sind, wie (in welcher Reihenfolge) werden diese Execption Handler abgearbeitet? |
Kurze Ergänzung. Es werden nie mehrere Handler abgearbeitet sondern immer nur einer benutzt! Und die Reihenfolge in der geprüft wird welcher verwendet wird ist einfach Top-Down. Man sollte die also immer nach Möglichkeit von der speziellsten zur allgemeinsten Exceptionklasse sortieren. Wenn du mehrer Exceptionhandler möchtest dann mußt du mehrerer try..catch Blöcke schachteln und die Exception per throw weiterwerfen.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 29.05.14 16:20
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 29.05.14 20:15
Zitat: | Ich habe es nicht ausprobiert, |
Ich jetzt aber. Ergebnis
Zitat: | A previous catch clause already catches all exceptions of this or of a super type ('System.Exception') |
Die Doku hat offensichtlich recht 
|
|
Ritzeratze 
      
Beiträge: 101
|
Verfasst: Sa 31.05.14 09:54
MOin ,
Danke für die ganzen Antworten. Das war sehr informativ und hat mich weitergebracht.
Gruss Ritze
|
|
Ritzeratze 
      
Beiträge: 101
|
Verfasst: So 01.06.14 11:15
Moin, eine abschließende Frage,
Wenn ich eine "Top Down" Priorisierung vornehme und von dem speziellsten zum generalistischen Handler verarbeite, wo muss dann ein Exception Handler stehen der alle denkbaren Ausnahmen gleichzeitig behandelt? Muss ich diesen in der Main Methode implementieren?
Gruss Ritze
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 01.06.14 15:56
Es gibt nicht den einen Ort wo man das tut. Ein Exceptionhandler gehört so nah oder fern von der eigentlichen problemauslösenden Stelle das man die sinnvoll verarbeiten kann und insbesondere sinnvoll entscheiden kann ob man hier abbricht oder das Programm weiterlaufen lässt. Wenn es einfach eine fixe Stelle gäbe würde es einem das Framework auch schon weitestgehend abnehmen.
Wenn du den Ort für eine letzte Verteidungslinie bevor das Programm abraucht suchst dann kommt es auf die Art des Programms an. Bei einer Konsolenanwendung ist es einfach die Main. Bei einer Winforms oder WPF Anwendung ist das zu spät da gibt es entsprechende Events in den Applivcation Klassen, bei Multithreadanwendungen muß man das je Thread berücksichtigen etc.
|
|