100 Stimmen

Abfangen von Ausnahmen bei Zugriffsverletzungen?

Ejemplo

int *ptr;
*ptr = 1000;

kann ich mit Standard-C++ eine Ausnahme von der Speicherzugriffsverletzung abfangen, ohne dass ich eine microsoft-spezifische.

9voto

Damien Punkte 277

Wie bereits erwähnt, gibt es auf der Windows-Plattform keine Möglichkeit, die nicht von Microsoft oder einem Compilerhersteller stammt. Es ist jedoch offensichtlich nützlich, diese Arten von Ausnahmen in der normalen try { } catch (exception ex) { } Art und Weise für die Fehlerberichterstattung und mehr eine anmutige Beendigung Ihrer App (wie JaredPar sagt, die App ist jetzt wahrscheinlich in Schwierigkeiten) zu fangen. Wir verwenden _se_translator_function in einem einfachen Klassenwrapper, der uns erlaubt, die folgenden Ausnahmen in einem try-Handler abzufangen:

DECLARE_EXCEPTION_CLASS(datatype_misalignment)
DECLARE_EXCEPTION_CLASS(breakpoint)
DECLARE_EXCEPTION_CLASS(single_step)
DECLARE_EXCEPTION_CLASS(array_bounds_exceeded)
DECLARE_EXCEPTION_CLASS(flt_denormal_operand)
DECLARE_EXCEPTION_CLASS(flt_divide_by_zero)
DECLARE_EXCEPTION_CLASS(flt_inexact_result)
DECLARE_EXCEPTION_CLASS(flt_invalid_operation)
DECLARE_EXCEPTION_CLASS(flt_overflow)
DECLARE_EXCEPTION_CLASS(flt_stack_check)
DECLARE_EXCEPTION_CLASS(flt_underflow)
DECLARE_EXCEPTION_CLASS(int_divide_by_zero)
DECLARE_EXCEPTION_CLASS(int_overflow)
DECLARE_EXCEPTION_CLASS(priv_instruction)
DECLARE_EXCEPTION_CLASS(in_page_error)
DECLARE_EXCEPTION_CLASS(illegal_instruction)
DECLARE_EXCEPTION_CLASS(noncontinuable_exception)
DECLARE_EXCEPTION_CLASS(stack_overflow)
DECLARE_EXCEPTION_CLASS(invalid_disposition)
DECLARE_EXCEPTION_CLASS(guard_page)
DECLARE_EXCEPTION_CLASS(invalid_handle)
DECLARE_EXCEPTION_CLASS(microsoft_cpp)

Die ursprüngliche Klasse stammt aus diesem sehr nützlichen Artikel:

http://www.codeproject.com/KB/cpp/exception.aspx

3voto

Martin York Punkte 245363

Nicht der Mechanismus zur Behandlung von Ausnahmen, Aber Sie können den signal()-Mechanismus verwenden, der von der C.

> man signal

     11    SIGSEGV      create core image    segmentation violation

Das Schreiben auf einen NULL-Zeiger wird wahrscheinlich ein SIGSEGV-Signal auslösen

-1voto

David Thornley Punkte 55244

Ein solcher Verstoß bedeutet, dass mit dem Code etwas ernsthaft falsch läuft und er unzuverlässig ist. Ich kann verstehen, dass ein Programm versuchen könnte, die Daten des Benutzers so zu speichern, dass sie hoffentlich nicht überschrieben werden, in der Hoffnung, dass die Daten des Benutzers nicht bereits beschädigt sind, aber es gibt per Definition keine Standardmethode für den Umgang mit undefiniertem Verhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X