Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Zitat von »"Das Gurke"«
Nullpointer Exceptions gehören bei mir auch zur absoluten Ausnahme und sollten dafacto nie geworfen werden. Sie sind keinesfalls Normalität, sondern immer kritische Fehler, die in vielen Fällen zum sofortigen Programmabbruch führen.
Zitat
void SetUpEmissiveAttributes(CGfxObject *pGfxObject, CGfxAttributes *pGfxAttribs)
// Setze die Grafik Attribute je nach Object.
// pGfxObject darf NULL sein, pGfxAttribs jedoch nicht
{
assert(pGfxAttribs);
if(pGfxObject && pGfxObject->IsTracer())
{
// Ist Leuchtspurmuni...
pGfxAttribs->eEmissiveType = EMISSIVE_TRACER;
.... hier sind weitere Berechnungen der anderen Attribute...
}
else
pGfxAttribs->eEmissiveType = EMISSIVE_NONE;
}
Zitat von »"David_pb"«
Wenn du dir so sicher bist das die Ausnahme ohnehin kaum auftritt, wieso behandelst du sie dann explizit?
Zitat
Und wieso führt sowas zum Programmabbruch?
Zitat von »"Osram"«
Zitat von »"David_pb"«
Wenn du dir so sicher bist das die Ausnahme ohnehin kaum auftritt, wieso behandelst du sie dann explizit?
Weil man aus Erfahrung weiss dass man praktisch nie 100% sicher ist sondern höchstens 99%.
Zitat von »"Osram"«
Zitat
Und wieso führt sowas zum Programmabbruch?
Weil sich alles aufwändigere nicht lohnt. In den meisten Fällen hat man ja keinen Fehler gemacht und der Pointer ist wirklich IMMER ungleich NULL. Und auch wenn ein assert / eine Exception die zum Programmabbruch führt keine 100% Lösung ist, ist es doch 80% und mit 10% des Aufwands.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
LONG CALLBACK CreateMiniDumpFile(EXCEPTION_POINTERS* pExceptionPointers) { MessageBoxW(NULL, L"Es ist ein Fehler aufgetreten und das Programm wird beendet.", L"Fehlerbericht", 0); static int x = 0; Atomic_Inc(&x); if(x == 1) { MINIDUMP_EXCEPTION_INFORMATION ExpParam; char FileName[40]; sprintf(FileName, "FiregalaxyDump_Version %i.dmp", GVERSION); HANDLE hDumpFile = CreateFile(FileName, GENERIC_READ|GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0); ExpParam.ThreadId = GetCurrentThreadId(); ExpParam.ExceptionPointers = pExceptionPointers; ExpParam.ClientPointers = false; int mdt = MiniDumpWithPrivateReadWriteMemory | MiniDumpWithDataSegs; if(!MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithPrivateReadWriteMemory, &ExpParam, 0, 0)) { int errorcode = GetLastError(); char ecode[10]; sprintf(ecode, "%i", errorcode); MessageBoxA(NULL, ecode, "Fehlerbericht", 0); } CloseHandle(hDumpFile); } return EXCEPTION_EXECUTE_HANDLER; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
nt main(int argc, char* argv[]) { #ifdef _CRTDBG_MAP_ALLOC _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); //memleakdetection #endif SetUnhandledExceptionFilter(CreateMiniDumpFile); } |
Zitat von »"Das Gurke"«
Naja, durch diese Exception kann ich mir immerhin vom "Kunden" einen Stacktrace zusenden lassen, zumindest sofern ich die pdbs mitliefere.
Und Osram hatte das ja auch schon angeschnitten: In dem von mir konkreten Fall sind Nullpointer einfach mit die heftigsten Fehler die auftreten können und kein Normalfall. Daher ist imho das Werfen einer Exception gerechtfertigt.
Aber ich denke, hier prallen einfach Welten aufeinander. Bei gewissen kontroversen Themen, wird man einfach nie zu einem wirklichen Konsens kommen.
Werbeanzeige