C# try and catch

DichterNebel

Cadet 4th Year
Registriert
Apr. 2009
Beiträge
66
Hi,

in dieser methode werden zwei zufällige generierte Zahlen dividiert.
Falls der Divisor 0 ist, soll per catch ein Hinweis erfolgen, aber bei dem steht dann immer
im label1 "+unendlich"

hier die methode :

Code:
private void button4_Click(object sender, EventArgs e)
        {
            try
            {

                Ergebnis = Zahl1 / Zahl2;
                label1.Text = Ergebnis.ToString();
            }

            catch 
            {
                label1.Text = "Durch 0 kann nicht geteilt werden";
            }
        }

hat jemand eine idee ?
 
Würde auch einen if case Vorschlagen für den Divisor, wäre glaube ich einfacher.
Es sei denn du hast da n besonderes Anlieger oder Ehrgeiz, da weis ich aber grad nichts ;(^^
 
DichterNebel schrieb:
Hi,

in dieser methode werden zwei zufällige generierte Zahlen dividiert.
Falls der Divisor 0 ist, soll per catch ein Hinweis erfolgen, aber bei dem steht dann immer
im label1 "+unendlich"

Du nutzt wahrscheinlich keine ganzzahligen Typen wie int, sondern wohl eher Gleitkomma wie double. C++, c# und sogar Java werfen bei Gleitkommazahlen wohl keine Exceptions bei Division durch 0. Du kannst aber ganz einfach - solange Du auf Exceptions bestehst - eine eigene werfen lassen.

Code:
if (Zahl2 == 0)
{
   throw new ArgumentException("Division durch 0");
}
else
[FONT=Consolas][FONT=Verdana]{[/FONT][/FONT]
   Ergebnis = Zahl1 / Zahl2;
   label1.Text = Ergebnis.ToString();
[FONT=Consolas][FONT=Verdana]}[/FONT][/FONT]
 
Du musst auch angeben welche exceptions abgefangen werden sollen. Dies macht man in Klammern hinter dem catch. wenn du alle Exceptions abfangen willst, einfach "Exception" abfangen:
Code:
try
{
    Ergebnis = Zahl1 / Zahl2;
    label1.Text = Ergebnis.ToString();
}

catch (System.Exception ex) 
{
     label1.Text = "Durch 0 kann nicht geteilt werden";
}

Das Beispiel hier ist sehr "unsauber", da nun alle Exceptions in der Erklärung "Durch 0 kann nicht geteilt werden" münden würden. Lieber eine Exceptions mehr unterscheiden als zu wenige...
Artikel hierzu:
http://msdn.microsoft.com/en-us/library/ms173162(v=vs.80).aspx
 
Ich schließe mich dem Rat an den Divisor zu testen und hier auf keinen Fall einen try-catch-Block zu verwenden. Das wäre besserer Stil.
 
Das wäre eher fahrlässig wenn es sich um Fließkommazahlen handeln sollte, da müsste man dann schon ein delta zur Sicherheit einbauen. Bei int ist das mit dem if aber sicherlich ok.
 
ich bin mir nicht 100% sicher, aber ich glaube bei jeder mir bekannten Programmiersprache ist teilen durch 0 unendlich... ;) ich meine sogar in C. Das ganze dient dazu das ein Programm in dem Fall nicht einfach abstürzt, denn sinnvoller weise kann man mit unendlich weiter arbeiten, auch wenn es in den meisten fällen keinen Sinn ergibt. (ich meine es spielt auch keine Rolle ob double oder int)

Des weiteren war ich der Meinung das bei C# die Labels über Content angesprochen werden, da bin ich etwas verwirrt.

Ansonsten wie schon gesagt per if an die Sache rangehen.
Viel erfolg beim Programmieren ;)

PS:
Das wäre eher fahrlässig wenn es sich um Fließkommazahlen handeln sollte, da müsste man dann schon ein delta zur Sicherheit einbauen. Bei int ist das mit dem if aber sicherlich ok.
wieso, es ist doch absolut zulässig durch 0.0001 zu teilen ;)
 
Zuletzt bearbeitet:
Des weiteren war ich der Meinung das bei C# die Labels über Content angesprochen werden, da bin ich etwas verwirrt.
Labels mit Text, Textboxen und Co. mit Content ;)
 
PapstRatze schrieb:
ich bin mir nicht 100% sicher, aber ich glaube bei jeder mir bekannten Programmiersprache ist teilen durch 0 unendlich... ;)

Bei int bekommst du wohl in so ziemlich jeder Sprache Ärger (beispielweise in Java eine Arithmetic Exception: Division by Zero und in C# DivideByZeroException). Bei Floating Point Zahlen ist es aber genau so wie du sagst, es sind dort -infinity und infitity vordefiniert, selbst wenn man durch ein hardcoded "0.0" teilt.

PapstRatze schrieb:
PS:
wieso, es ist doch absolut zulässig durch 0.0001 zu teilen ;)

Zulässig natürlich, aber es geht doch viel mehr darum, ob es semantisch das ist, was der Programmierer wirklich wollte :) Wegen sowas sind schon Leute gestorben, finde leider gerade den Artikel dazu nicht.
 
Mike Lowrey schrieb:
Labels mit Text, Textboxen und Co. mit Content ;)

Interessanterweise ist es bei mir genau Umgekehrt. Da stellt sich mir direkt die Frage ob das ggf von der Entwicklungsoberfläche abhängig ist? Ich darf Visual Studio 2010 professional nutzen. (dankenswerter Weise verschenkt die FH Versionen solange man Student ist^^)

Jetzt habe ich auch mal ausgetestet, es ist tatsächlich der Fall das bei int ein Fehler kommt, ich nutze das wohl zu selten :D
 
Mit VC# Express ists genauso. Label.Content, Button.Content und TexBox.Text (zumindest mit WPF).
 
Ah ja sorry war anders herum, hatte es nicht nochmal geprüft...
(Visual Studio 2010 Ultimate)
 
Zurück
Oben