Ursprünglicher Titel war: Bug in C# Convert.ToInt32() ?
Hallo,
folgender Code löst bei mir ein Programmverhalten aus, das ich mir nicht erklären kann:
private void Form1_Load(object sender, EventArgs e)
{
object test = new object();
// beendet funktion ohne exception:
int x = Convert.ToInt32(test);
// wird nicht ausgeführt:
this.Text = "test";
}
Die Funktion wird ohne Exception beendet. Der nachfolgende Code wird schlicht weg ignoriert.
Weiß einer warum?
Ich bekomm da folgendes:> Fehlermeldung:
Das Objekt des Typs "System.Object" kann nicht in Typ "System.IConvertible" umgewandelt werden.
Probier mal folgendes:
try
{
Convert.ToInt32(new object());
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString(),ex.GetType().Name);
}
Hallo Floste,
dein Code wirft bei mir eine Exception.
Meiner bleibt nach wie vor stumm, keine Exception etc.
Eine Try-Catch Anweisung hilft bei meiner Variante auch nicht weiter...
Welche VS Version nutzt du?
Ich verwende VC# 2010 Express.
Mfg,
uglykidkap
Hallo uglykidkap,
warum du zum Schluss eines Bugs kommst ist mir nicht klar. Die Convert.ToInt32 ist sichlich keine Methode die selten verwendet wird und die es auch schon lange in .net gibt. Wäre hier tatsächlich ein Bug vorhanden, so wäre dieser sicher schon längst gefixt worden sein.
Bei solchen Fällen sollte der Fehler zuerst immer beim eigenen Code gesucht werden.
Die Exception wird bei dir im Application.ThreadException Event (System.Windows.Forms) behandelt od. im AppDomain.UnhandeldException.
BTW: mit int.TryParse bist du sicherer dran.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Ich behaupte nicht das ein BUG existiert sonder FRAGE ob es einer ist.
Wenn der Fehler in meinem Code liegt, dann zeig mir doch bitte wo sich in den 3 Zeilen Code "mein Fehler" versteckt.
private void Form1_Load(object sender, EventArgs e)
{
// wirft keine Exception
object x = new object();
int y = Convert.ToInt32(x);
// wirft exception
try
{
object a = new object();
int b = Convert.ToInt32(a);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), ex.GetType().Name);
}
}
Warum?
Hallo uglykidkap,
dann zeig mir doch bitte wo sich in den 3 Zeilen Code "mein Fehler" versteckt.
in
int y = Convert.ToInt32(x); ... int b = Convert.ToInt32(a);
ist der Fehler.
Schau dir meinen oberen Post an, und handle diesen beiden Events. Dann wirst du sehen dass der Fehler auch ohne try-catch geworfen wird.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Ich denke er bezog sich auf den Code im Eingangsbeitrag:
private void Form1_Load(object sender, EventArgs e)
{
object test = new object();
// beendet funktion ohne exception:
int x = Convert.ToInt32(test);
// wird nicht ausgeführt:
this.Text = "test";
}
Hallo uglykidkap,
du verschluckst nicht irgendwo die Exception, zum Beispiel durch globales Abfangen?
// Edit:
Ich habe es eben mal getestet, wenn ich Application.ThreadException aboniere und diesen leer lasse, kann ich dein Problem nachvollziehen. Hast du dies denn aboniert?
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Hallo inflames2k,
danke für deinen Post.
Ich denke er bezog sich auf den Code im Eingangsbeitrag:
Danke, genau das meinte ich 😉
du verschluckst nicht irgendwo die Exception, zum Beispiel durch globales Abfangen?
Nein, das Projekt besitzt nicht mehr Zeilen Code als hier gepostet.
Ich habe es eben mal getestet, wenn ich Application.ThreadException aboniere und diesen leer lasse, kann ich dein Problem nachvollziehen. Hast du dies denn aboniert?
Nein, habe ich nicht.
Ich habe nur ein leeres Windows Forms Projekt erstellt, die 3 Zeilen Code hineinkopiert und gestartet.
Kannst du mir mal deinen Code zeigen wo du Application.ThreadException abonnierst?
@gfoidl:
Danke für den Link, hab ich beim ersten Lesen irgendwie übersehen. Werd mir das morgen mal durchlesen.
Danke und Gruß,
uglykidkap
Hallo uglykidkap,
ich habe das selbe Problem wie du, unbehandelte Exceptions werden von Visual Studio 2010 Express nicht mehr angezeigt sondern einfach übersprungen.
Erst wenn ich einen Try/Catch Block einsetze stoppt VS und zeigt mir den Fehler an.
Probier mal den Code nicht in Form Load sondern im Konstruktor auszuführen, wenn ich das mache bekomme ich die Fehlermeldung angezeigt.
MfG
fz
"We better hurry up and start coding, there are going to be a lot of bugs to fix."
Hast Du überhaupt "Break, when an exception is Thrown" aktiviert?
-> Debug -> Exceptions
Bei "Common Language Runtime Exceptions" einen Haken bei "Thrown" setzen und nochmal probieren.
du verschluckst nicht irgendwo die Exception, zum Beispiel durch globales Abfangen?
Nicht direkt - allerdings kommt das Verhalten zustande, da die Methode ein Eventhandler für das Form.Load-Ereignis ist. Wenn dort eine Exception geworfen wird, wird die einfach geschluckt.
Hallo,
bei mir war es wie Kileak sagte, jedoch war der Menüpunkt -> Debuggen -> Ausnahmen nicht vorhanden.
Gewusst wie: Unterbrechen bei ausgelöster Ausnahme, hier ist beschrieben wie er hinzugefügt werden kann.
Nachdem ich dort das Häcken gesetzt habe läuft alles wie gewohnt.
Vielen Dank 😃
fz
"We better hurry up and start coding, there are going to be a lot of bugs to fix."
Hallo Zusammen,
danke für den Link, das hat mein Problem gelöst!
Der Code im Threadeingang wird nun mit einer Exception unterbrochen.
Vielen Dank!
Grüße,
uglykidkap