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:
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.
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:
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
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.
Tags und Links c# system.drawing