IllegalArgumentException - Fehler lässt sich nicht catchen

  • C#
  • .NET (FX) 4.0

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von BeatsleigherXDA.

    IllegalArgumentException - Fehler lässt sich nicht catchen

    Hallo,

    ich benutze derzeit einen Thread, zusammen mit einer ListView, um eine Liste von Spielern aus dem Level eines Craftbukkit-Servers auszulesen (Port von BukkitUI zu C#).
    Es tritt, erst wenn ich aber den Control sehen will, eine IllegalArgumentException in meiner ListView-Control auf, die BukkitUI dann einfach abstürzen lassen.

    Ja, wenn ich den Code komplett aus-kommentiere, kann ich mir die Control wieder ansehen.


    Hier ist der Code den ich benutze, vielleicht sagt es einem von euch ja mehr über den Fehler als mir.

    C#-Quellcode

    1. private static String getHelmUrl(String playerName) {
    2. return "https://minotar.net/helm/" + playerName + "/32.png";
    3. }
    4. public static void loadServerPlayers(ListView lstView, Form1 instance) {
    5. ImageList helmList = new ImageList();
    6. helmList.ImageSize = new Size(32, 32);
    7. lstView.SmallImageList = helmList;
    8. new Thread(() => {
    9. helmIdx = 0;
    10. while (runManagement) {
    11. try {
    12. instance.Invoke((MethodInvoker)delegate {
    13. foreach (String player in Directory.GetFiles(Path.Combine(Properties.Settings.Default.bukkitDir, serverProps.levelName, "players"))) {
    14. if (player.ToLower().EndsWith(".dat")) {
    15. String name = Path.GetFileNameWithoutExtension(player);
    16. // Download player's helm and put into helmList
    17. using (WebClient wc = new WebClient()) {
    18. byte[] helmData;
    19. helmData = wc.DownloadData(getHelmUrl(name));
    20. using (MemoryStream memStream = new MemoryStream(helmData))
    21. using (Bitmap bmp = new Bitmap(memStream)) {
    22. helmList.Images.Add(bmp);
    23. }
    24. wc.Dispose();
    25. }
    26. // Add player name and helm to lstView
    27. bool add = true;
    28. foreach (ListViewItem item in lstView.Items) {
    29. if (item.Name.Equals(player))
    30. add = false;
    31. }
    32. if (add) {
    33. lstView.Items.Add(name).ImageIndex = helmIdx;
    34. helmIdx++;
    35. }
    36. }
    37. }
    38. });
    39. } catch (Exception ex) {
    40. MessageBox.Show(instance, "An error occurred while loading server players: " + ex.InnerException + "\n"
    41. + "Stack trace: " + ex.StackTrace + "\n\n"
    42. + "Please report this error to the developer!", "Error Occurred While Loading Server Players!",
    43. MessageBoxButtons.OK, MessageBoxIcon.Error);
    44. }
    45. Thread.Sleep(2500); // Sleep for 2.5 seconds to prevent any weird overflows.
    46. }
    47. }).Start();
    48. }


    Hier ist die Fehlermeldung, die ich bekomme:


    Ich bedanke mich schon mal im Voraus für eure Hilfe

    P.S.: Ich habe keine Stacktrace, denn der Fehler lässt sich nicht catchen.
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln
    IllegalArgumentException in C#? Du meinst ArgumentException. Das ist kein Java ;)
    Wenn die nicht gecatcht wird, dann wird das wohl an den Ausnahmeeinstellungen liegen.

    Gehe in VS in den Einstellungen zu Debugging->Ausnahmen und schau da nach CLR-Exceptions oder sowas (halt die von .NET).
    Dann suche nach der ArgumentException und gehe sicher, dass kein Haken bei "Werfen" gesetzt ist, sonst wirft er das trotz Handler manchmal. Was ich mir hier aber nicht denken kann, da die Meldung da nicht drauf hinweist.

    Von daher catchst Du wohl am falschen Punkt, daran muss es liegen. Dazu bräuchte man StackTrace.

    P.S.: Ich habe keine Stacktrace, denn der Fehler lässt sich nicht catchen.​

    Ja und? Das meldet doch die IDE am Besten? Also schreib den Fehler hier rein. Wenn die IDE nicht meldet, dann setze Haltepunkte und steppe mal im Debugging durch und schau, wann genau der Fehler kommt.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    OMA schrieb:

    Mach doch erstmal den Try&Catch Block raus, damit die IDE dir meldet an welcher Stelle der Fehler auftaucht...*

    Ich schätze, dass dies nicht nötig ist, da die Exception ja bereits geworfen wird, was darauf hindeutet, dass er sie gar nicht behandelt. Wahrscheinlich sieht er nur nicht, dass die Zeile, in der die Ausnahme verursacht wurde markiert wird.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @BeatsleigherXDA Mach aus dem Lambda-Ausdruck ne richtige Prozedur und ruf diese als Thead-Prozedur auf.
    Dort kannst Du dann auch einen Haltepunkt reinsetzen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Trade schrieb:

    IllegalArgumentException in C#? Du meinst ArgumentException. Das ist kein Java


    Macht die Gewohnheit.. Aber da habe ich weniger mit den Fehlern zu tun, da ich sie meistens innerhalb von JDroidLib schmeißen muss.

    @RodFromGermany Ich habe mal den Thread komplett ausgemacht, stattdessen nur einen Durchlauf gemacht und habe es vorsichtshalber aufgenommen, da ich glaube, dass ich mich nicht deutlich genug ausgedrückt habe.
    Hier ist das video:

    Breakpoints haben leider auch nichts gebracht, da alles einwandfrei durchläuft. Der Fehler tritt wirklich erst dann auch, wenn ich mir die Control anschuen will.
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln

    BeatsleigherXDA schrieb:

    Ich habe mal den Thread komplett ausgemacht,
    Mach mal ein paar Logausgaben in Dein Programm, um den Übeltäter einzugrenzen:

    VB.NET-Quellcode

    1. IO.File.AppendAllText("c:\Temp\log.txt", "eindeutige Kennung" & Environment.NewLine)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wird gemacht. Einen Moment..

    @RodFromGermany Ich habe ein paar Terminal-Ausgaben gemacht, und wie auch die Male davor, der Thread läuft einmal komplett und ohne Fehler durch:


    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BeatsleigherXDA“ ()

    BeatsleigherXDA schrieb:

    ohne Fehler
    Na fein.
    Interessant wird das erst, wenn es wieder knallt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der Thread alleine läuft ohne Fehler - Es ist halt erst, wenn ich die Controls sehen will - Dann fliegt er mir um die Ohren. Die IDE tut so, als würde es ihr nichts angehen, sagt kurz das da was ist, zeigt mir aber an keiner Stelle, wo etwas passiert.

    Das ist gerade mein Problem; hätte ich eine Stacktrace o.ä., hätte ich erst gar nicht gefragt, aber da das nicht der Fall ist, muss ich nun mal fragen.
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln

    BeatsleigherXDA schrieb:

    using (MemoryStream memStream = new MemoryStream(helmData))
    using (Bitmap bmp = new Bitmap(memStream)) {
    helmList.Images.Add(bmp);
    }
    wc.Dispose();

    Find ich ziemlich Eindeutig: Du fügst ein Bild hinzu und löschst es anschließend. Deshalb kommt es erst beim anzeigen der UI und im speziellen ist es ne Exception aus System.Drawing...
    Soweit ich weiß muss der Stream auch geöffnet bleiben, für das Bitmap, oder du klonst es:

    C#-Quellcode

    1. using (MemoryStream memStream = new MemoryStream(helmData))
    2. using (Bitmap bmp = new Bitmap(memStream)) {
    3. helmList.Images.Add((Bitmap)bmp.Clone());
    4. }
    5. wc.Dispose();

    sollte denk ich gehen.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---