In Delphi 7, ist 'versuchen ... außer zu erhöhen; Ende;' überhaupt sinnvoll?

7

In einigen Delphi 7-Code, den ich behalte, habe ich eine Menge folgender Fälle bemerkt:

%Vor%

Es scheint mir, dass diese try Blöcke entfernt werden könnten, da sie nichts tun. Ich bin jedoch vorsichtig mit möglichen subtilen Nebenwirkungen ..

Kann irgendjemand an irgendwelche Fälle denken, in denen diese Blöcke tatsächlich etwas tun könnten, was ohne sie dort nicht passieren würde?

    
Blorgbeard 30.04.2009, 02:12
quelle

8 Antworten

10

In diesem Kontext hat die Raise-Operation keine Wirkung und sollte entfernt werden, da sie einfach die Ausnahme wieder aufruft, die der Ausnahmeblock gerade gefangen hat. Raise wird normalerweise verwendet, um die Kontrolle an das Ende des Blocks zu übertragen, wenn keine geeignete Fehlerbehandlung verfügbar ist. Im Folgenden behandeln wir die benutzerdefinierte Ausnahme, aber jede andere Ausnahme sollte anderswo behandelt werden.

%Vor%

Achten Sie darauf, dass es eine ähnlich aussehende Form ohne "Raise" gibt, die den Nebeneffekt des Essens / Verbergens von Ausnahmen hat. Praktiken von sehr skrupellosen Entwicklern, die hoffentlich zu Positionen im Wettbewerb gewechselt haben.

%Vor%     
MikeJ 30.04.2009, 02:27
quelle
6

Das Entfernen des Ausnahmecodes im obigen Code-Snippet macht keinen Unterschied. Sie können (und ich glaube, dass Sie sollte , da es die Lesbarkeit reduziert) es entfernen.

    
Hemant 30.04.2009 02:17
quelle
2

Okay, wirklich zwei Fragen hier.

Erstens ist es ist bedeutungsvoll: Wenn execSQL eine Ausnahme auslöst, wird es vom try-Block abgefangen und an das except weitergeleitet. Dann wird es durch die Erhöhung zum nächsthöheren Block weitergeleitet.

Zweitens, ist es nützlich ? Wahrscheinlich nicht. Es ist fast sicher das Ergebnis eines von drei Dingen:

  1. Jemand mit spitzen Haaren hat einen Codierungsstandard geschrieben, der besagt: "Alle Operationen, die eine Ausnahme auslösen können, müssen sich in einem try-Block befinden."
  2. Jemand wollte zurückkommen und die vom execSQL -Statement gemachten Ausnahmen in eine andere, aussagekräftigere Ausnahme umwandeln.
  3. Jemandem, der neu war, war nicht bewusst, dass das, was sie geschrieben hatten, isomorph war, die Umgebung der Mutter sich um die Ausnahme kümmern zu lassen, und dachte daher, dass sie > es weiterleiten sollte.
Charlie Martin 30.04.2009 02:30
quelle
2

Ich habe vielleicht ein bisschen schnell geantwortet, siehe am Ende ...
Wie es ist, ist es für die Anwendung nutzlos .
Zeitraum!

Jetzt auf der "warum" -Seite. Es kann sein, die Ausnahmebehandlung zu standardisieren, wenn / an anderen Stellen / ist / ist / ist / ist / irgendeine Art von Protokollierungscode, der vor der Erhöhung eingefügt wurde:

%Vor%

oder für Cleanup-Code:

%Vor%

Update : Es würde einen Fall geben, in dem ich etwas genau so sehen würde, wie es ist ...
... um einen Haltepunkt in die raise -Zeile einzufügen, um eine Chance zu bekommen, zu sehen, was im Kontext dieses Code-Blocks vor sich geht.

    
François 30.04.2009 03:37
quelle
2

Dieser Code tut nichts anderes, als dem ursprünglichen Programmierer zu erlauben, einen Haltepunkt auf dem 'Raise' zu setzen und die Ausnahme näher in der Quelle zu ihrer möglichen Ursache zu sehen. In diesem Sinne ist es eine absolut vernünftige Debugging-Technik.

    
Brian Frost 30.04.2009 06:40
quelle
1

Eigentlich sollte ich dies als Kommentar zu François 'Antworten posten, aber ich weiß nicht, ob es möglich ist, dort formatierten Code einzufügen :( Ich poste das als Antwort.

2mghie:

  
    
      

Der zweite ist völlig unidiomatisch, würde man stattdessen stattdessen verwenden.

    
  

Nein, "finally" reinigt das Objekt immer. "Außer" - nur bei Ausnahme. Betrachten Sie den Fall der Funktion, die ein Objekt erstellt, füllt und zurückgibt:

%Vor%

Wenn Sie "finally" dort setzen - Funktion wird immer nil zurückgeben. Wenn Sie den "try" -Block überhaupt nicht angeben, werden im Falle einer Ausnahme in "..." Ressourcen auslaufen.

P.S. Natürlich können Sie "finally" verwenden und ExceptObj überprüfen, aber ... ist das nicht hässlich?

    
Alex 30.04.2009 04:38
quelle
0

Der Titel enthält eine ziemlich breite Frage, während seine Erklärung ein konkreteres Beispiel gibt. Also, meine Antwort auf die Frage, wie es von dem Beispiel ausgeht, kann zweifelhaft etwas Nützliches hinzufügen, was bereits hier gesagt wurde.

Aber vielleicht möchte Blorgbeard tatsächlich wissen, ob es überhaupt sinnvoll ist, try ... except raise; end . Wenn ich mich in Delphi 7 richtig erinnere, würde Exit den finally -Teil eines try-finally Blocks auslösen (als wäre es eine Art Ausnahme). Jemand könnte ein solches Verhalten für seine Aufgabe als ungeeignet betrachten, und die Verwendung der betreffenden Konstruktion ist eine echte Umgehungslösung.

Nur wäre es immer noch seltsam, dort ein einziges raise; zu verwenden, aber dann hätten wir lieber über Nützlichkeit als über Sinnhaftigkeit gesprochen, wie Charlie genau beobachtet hat.

    
Andy M 30.04.2009 14:57
quelle
0

Dieser Code tut nichts anderes, als eine Ausnahme erneut auszulösen, die bereits ohne diesen Versuch außer block ausgelöst wird. Sie können es sicher entfernen.

    
Stephane Wierzbicki 30.04.2009 18:25
quelle