| 

.NET C# Java Javascript Exception

6
Hallo zusammen,

folgendes Problem: ich möchte einen Try-Block, der so lange durchlaufen werden soll, bis der Block fehlerfrei durchlaufen wird (ggf. bei der Exception eine Messagebox mit dem Fehler). Ich dachte schon daran, den Try-Block so ähnlich zu umbauen:

Do
Dim flag as Byte = 0
Try
'Some code
flag = 1
Catch
Messagebox.Show("Pech gehabt!")
End Try
loop Until flag=1

Hat aber den Nachteil, dass "flag" in der Until-Bedingung nicht mehr bekannt ist. Das Dim vor dem Do funktioniert natürlich.

Gibt es elegantere Lösungen?
News:
26.10.2011
muffi 1,4k 1 9
3 Antworten
-2
So besser?
While True
Try
DoSomCode()
Exit While
Catch ex As Exception
Console.WriteLine("Pech gehabt")
End Try
End While
26.10.2011
Karl 958 8
Ich würde diese Idee aufgreifen und mit einer MessageBox "Retry, Cancel" und einer Flag, welche _außerhalb_ des try-catch definiert wird, den Abbruch steuern... zur Not halt, ist immer noch nicht elegant ;)
Karill Endusa 26.10.2011
1
Ich fände es hilfreich, wenn diejenigen, die hier negative Bewertungen vergeben haben, per Kommentar ihre Beweggründe erläutern könnten. Die von muffi gestellte Aufgabe bietet sicher reichlich Anlass zur Diskussion, ob man so was machen sollte, aber wenn man die Aufgabe mal als gesetzt nimmt, finde ich an der Lösung von Karl nichts auszusetzen.
Matthias Hlawatsch 27.10.2011
Danke Matthias. Sehe ich genau so. Aufgabe waer das Do-Loop abzulösen und nicht ob es Good-Style ist ein Try-Catch in einer Schleife abzufangen...
Karl 28.10.2011
3
Dein Ansatz ist schon verkehrt.
Ein try-catch-Block ist dazu da eine Ausnahme (Exception) zu behandeln.
Deine Frage zielt aber darauf ab, mit einem try-catch-Block eine Bedingung zu prüfen. Hierfür ist Exception-Handling nicht vorgesehen.
Zudem kann deine Idee dazu führen, dass das Programm "hängen" bleibt. Was, wenn die Bedingung nie erfüllt wird? Dann läuft das Programm in einer Endlosschleife.
Stattdessen solltest du bei nicht erfüllter Bedingung den User informieren und auf weitere Benutzereingaben warten.
26.10.2011
Jürgen Luhr 7,1k 1 9
Manchmal ist es nicht schlecht in einer Schleife die Exceptions abzufangen. Ein In einem Dienst würde ich es nicht anders machen. Aber du hast natürlich Recht, es muss auch einen Weg "raus" geben...

Gruß Karl
Karl 26.10.2011
Der Jürgen zerreißt mich wieder mal in der Luft ;-) Die Bedingung, die ich erfüllen möchte, trifft irgendwann zu. Ich möchte eigentlich einfach nur abfangen, wenn ein MySQL-Server kurz down ist (z. B. wegen Updates). Das Teil ist ja über kurz oder lang wieder verfügbar und damit liegt ja keine Endlosschleife vor. Von daher ist Karls While-Schleife ziemlich zielführend.
muffi 26.10.2011
1
Nein ich zerreisse niemanden ;o)
Trotzdem frage ich nach: Was, wenn der Sql-Server down und danach nicht verfügbar ist, weil z.B. der Admin das Lan-Kabel abgezogen hat?
Ich würde Richtung Client eine Exception mit entsprechendem Hinweis werfen, dann hat dieser die Möglichkeit manuell zu einem späteren Zeitpunkt erneut zu speichern.
Mir wäre diese Schleife zu heikel.
Jürgen Luhr 26.10.2011
Dann wäre es aber besser die betr. SqlException abzufangen und nach einer entspr. Wartezeit erneut zu versuchen die Verbindung zu öffnen. Jürgen hat schon recht, das Werfen einer Exception ist einem echten Fehlerzustand vorbehalten und kein "gewöhnlicher" Codepfad.
puls200 26.10.2011
Da kann ich mich nur meinen Vorrednern Jürgen / puls200 anschließen. Exceptions sollten niemals zur Steuerung einer Anwendung verwendet werden (Es kann die Anwendung auch u.U. merklich verlangsamen). Stattdessen solltest du auf jeden Fall Prüfen ob der Server überhaupt da ist. Der User sollte dann eine dementsprechende Meldung erhalten.

Btw: Eine Anwendung die ausschließlich Exceptions zur Programmsteuerung wirft wär mal interessant ;)
cruX 26.10.2011
1
Mit einem Label und einem goto sparst du dir das Flag..

(Jetzt werde ich gleich von den OOP Profis erschlagen)

;-)
26.10.2011
puls200 3,8k 7
3
Das nasses Handtuch ist schon aufgerollt. Komm mal hier vorbei. Man muss ja nicht alles machen was geht... :)
Karl 26.10.2011
Ja, das gute, alte GoTo hatte ich auch schon - aber das empfinde ich in dem Fall als unbefriedigend. Von daher werde ich mal eine Mischung aus Karl, Karill und puls2000 versuchen - mehrere Meinungen sind halt doch immer praktisch.
muffi 26.10.2011
1
Hör nicht auf diesen Ungläubigen xD
Man sollte im Vorfeld festlegen ob man eine Anwendung Objekt orientiert oder prozedual programmiert... bitte nicht beides. Sieht sch*** (schlecht) aus :P
cruX 26.10.2011
1
Ich möchte mein altes Basic 2.0 wieder zurück... da gabs nur goto und keine OOP ;-)
muffi 26.10.2011
1
Die Zeiten sind leider oder Gott sei Dank vorbei. Ist Ansichtssache ;)
cruX 26.10.2011
nein, ich erschlag dich nicht. was haben alle gegen ein gelegentliches goto? wenn es den code kürzer macht ....
nabuchodonossor 28.10.2011
1
Selten setze ich natürlich auch ein goto ein - in manchen Situationen macht das in der Tat den Code nicht nur kürzer, sondern (meiner Meinung nach) sogar übersichtlicher. Die Diskussion ist aber müßig, denn jeder schreibt seinen Code anders...
muffi 28.10.2011

Stelle deine .net-Frage jetzt!