System.Drawing Out of Memory Exception

7

Meine Anwendungsgrafik-Engine löst diese Ausnahmen aus. Sie werden alle von einem leeren Fangblock verzehrt. In den frühen Tagen fand ich eine, die nicht gefangen war (verbunden mit der Erweiterung des Stiftes, wie ich mich erinnere). Ich habe es mit Versuch und einem leeren Fangblock umgeben. Es scheint, dass diese Ausnahmen keinen Einfluss auf die erstellte Zeichnung haben. Ich habe etwas darüber gelesen, ohne es wirklich zu verstehen oder zu verstehen.

Also zu meinen Fragen:

  1. Warum sollten diese geworfen werden, wenn sie sicher konsumiert werden können? und
  2. Ist es sicher, sie zu ignorieren? Ich mache mir Sorgen, dass jeder einen versteckten Effekt hat. Ich habe Speicherlecks, die ich zum Beispiel nie gefunden habe.
ScruffyDuck 28.06.2011, 12:01
quelle

3 Antworten

19

Ich habe gesehen, dass System.Drawing OutOfMemoryExceptions geworfen hat, selbst wenn nicht genug Arbeitsspeicher zur Verfügung steht. Einige GDI + -Funktion gibt anscheinend nur einen dummen Fehlercode zurück.

IIRC, Sie erhalten eine OutOfMemoryException, wenn Sie versuchen, einen LinearGradientBrush zu verwenden, um ein Rechteck zu füllen, dessen Breite oder Höhe Null ist. Es kann auch andere Bedingungen geben, aber das ist die Hauptsache, in die wir geraten sind.

In diesem Fall müssen Sie nicht versuchen / fangen. Fügen Sie einfach eine if -Anweisung zu Ihrem Zeichnungscode hinzu und füllen Sie das Rechteck nicht, wenn die Breite oder Höhe Null ist.

Update: Nach den Kommentaren auf Diese Antwort kann auch auftreten, wenn Sie versuchen, eine beschädigte Image-Datei zu laden. Dafür hättest du keine andere Wahl als zu versuchen / fangen.

Sie sind wahrscheinlich sicher OutOfMemoryExceptions von GDI + abzufangen, aber halten Sie die try-Blöcke so klein wie möglich. Erwägen Sie, die Ausnahmen zu protokollieren, damit Sie die Protokolle analysieren und gegebenenfalls einen defensiven Code hinzufügen können. Sie möchten eine echte OutOfMemoryException nicht maskieren, aber Sie möchten auch nicht, dass ein dummer GDI + -Fehlercode Ihre App zum Absturz bringt.

    
Joe White 28.06.2011, 12:15
quelle
2

Es ist eine ziemlich schlechte Ausnahme: Ссылка .. nicht genug Speicher um die Ausführung des Programms fortzusetzen .

Sie werden oft feststellen, wenn Sie so viel zugewiesen haben, dass "einfache" Operationen / Zuweisungen diese Nachricht werfen, wird die App bald darauf abstürzen. Wenn es eine massive Zuweisung gibt, die fehlschlägt, können Sie möglicherweise fortfahren.

Wenn die App etwas Wichtiges tut, sollten Sie versuchen, die Dinge ordnungsgemäß zu schließen.

Um Ihre Fragen explizit zu beantworten:

  1. Sie werden ausgelöst, damit die App reagieren / wiederherstellen kann: Einige Speicherzuordnungen (Objekte mit 10 GB) können in vielen Situationen fehlschlagen, möglicherweise ein Absturz mit einer Zeile ( int[] x = new int[5368709120]; ) Entsprechung) sollte wirklich eine Ausnahme auslösen, anstatt alles abzustürzen

  2. Es sollte keinen versteckten Effekt geben, aber wenn eine Zuweisung fehlschlägt, dann vielleicht das nächste Mal, wenn Sie ein string oder ein anderes nützliches Objekt auf eine kleine Weise für den allgemeinen Betrieb der App reservieren wollen: Dinge könnten instabil werden . Je nach Umgebung können Sie diese Ausnahme jederzeit erhalten.

Bearbeiten: Jeder, der dies liest, sollte auch bedenken, dass GDI + diese Ausnahme anscheinend auch aus anderen Gründen auslöst.

    
Kieren Johnstone 28.06.2011 12:05
quelle
0

Ich habe versucht, die Lösung "Joe White" vorgeschlagen und das war es. Es wurde eine OutOfMemoryException ausgelöst, weil die Breite und Höhe des Rechtecks ​​0 waren. In meinem Fall wurde das Fenster minimiert, als die Ausnahme auftrat.

Hier ist ein Beispiel;

%Vor%     
Begi 01.03.2016 19:25
quelle

Tags und Links