MCPcopy Create free account
hub / github.com/TombEngine/TombEngine / HandleException

Function HandleException

TombEngine/Specific/winmain.cpp:310–412  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

308}
309
310LONG WINAPI HandleException(EXCEPTION_POINTERS* exceptionInfo)
311{
312 DWORD code = exceptionInfo->ExceptionRecord->ExceptionCode;
313 const char* codeName = "Unknown exception";
314
315 // Map exception codes to strings.
316 switch (code)
317 {
318 case EXCEPTION_ACCESS_VIOLATION: codeName = "Access violation"; break;
319 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: codeName = "Array out of bounds"; break;
320 case EXCEPTION_BREAKPOINT: codeName = "Breakpoint encountered"; break;
321 case EXCEPTION_DATATYPE_MISALIGNMENT: codeName = "Data type misalignment"; break;
322 case EXCEPTION_FLT_DIVIDE_BY_ZERO: codeName = "Floating-point division by zero"; break;
323 case EXCEPTION_FLT_OVERFLOW: codeName = "Floating-point overflow"; break;
324 case EXCEPTION_ILLEGAL_INSTRUCTION: codeName = "Illegal instruction"; break;
325 case EXCEPTION_IN_PAGE_ERROR: codeName = "Exception in page error"; break;
326 case EXCEPTION_INT_DIVIDE_BY_ZERO: codeName = "Integer division by zero"; break;
327 case EXCEPTION_INT_OVERFLOW: codeName = "Integer overflow"; break;
328 case EXCEPTION_INVALID_DISPOSITION: codeName = "Invalid disposition"; break;
329 case EXCEPTION_NONCONTINUABLE_EXCEPTION: codeName = "Non-continuable exception"; break;
330 case EXCEPTION_PRIV_INSTRUCTION: codeName = "Private instruction exception"; break;
331 case EXCEPTION_SINGLE_STEP: codeName = "Single-step exception"; break;
332 case EXCEPTION_STACK_OVERFLOW: codeName = "Stack overflow"; break;
333 }
334
335 // Try to resolve symbol name from address.
336 HANDLE process = GetCurrentProcess();
337 SymInitialize(process, NULL, TRUE);
338
339 DWORD64 address = (DWORD64)exceptionInfo->ExceptionRecord->ExceptionAddress;
340 char symbolBuffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME];
341 PSYMBOL_INFO symbol = (PSYMBOL_INFO)symbolBuffer;
342 symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
343 symbol->MaxNameLen = MAX_SYM_NAME;
344
345 // Display function name, if debug symbols are available, otherwise display address only.
346 std::ostringstream oss;
347 if (SymFromAddr(process, address, 0, symbol))
348 {
349 oss << "address " << symbol->Name << " (0x" << std::hex << address << ")";
350 }
351 else
352 {
353 oss << "address 0x" << std::hex << address;
354 }
355
356 auto errorMessage = "Unhandled exception: " + std::string(codeName) + " at " + oss.str() + ".";
357
358 // Log the exception and show error message.
359 TENLog(errorMessage, LogLevel::Error);
360
361 // Optionally print stack trace, if engine is in debug mode.
362 if (DebugMode)
363 {
364 oss = std::ostringstream{};
365 oss << "Stack trace:\n";
366
367 CONTEXT ctx = *exceptionInfo->ContextRecord;

Callers

nothing calls this directly

Calls 3

TENLogFunction · 0.85
ShowExternalMessageBoxFunction · 0.85
strMethod · 0.45

Tested by

no test coverage detected