From 6ae7e24675cff4ff6b808c3024f45083f35ced97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Sat, 3 Sep 2022 15:28:56 +0200 Subject: Improve error handling. --- c/err.cpp | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 c/err.cpp (limited to 'c/err.cpp') diff --git a/c/err.cpp b/c/err.cpp new file mode 100644 index 0000000..fd35ddd --- /dev/null +++ b/c/err.cpp @@ -0,0 +1,87 @@ +#include +#include +#include +#include + +#include "err.h" +#include "util.h" +#include "win32.h" + +Err::Err(ErrType t, const wchar_t* fmt) +{ + switch (t) { + case GENERIC: + what = fmt; + break; + case WINDOWS: + { + wchar_t* msg; + DWORD lenMsg = FormatMessageW( + FORMAT_MESSAGE_ALLOCATE_BUFFER + |FORMAT_MESSAGE_FROM_SYSTEM + |FORMAT_MESSAGE_IGNORE_INSERTS, + nullptr, + GetLastError(), + MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), + (wchar_t*)&msg, + 0, nullptr); + what = std::wstring(lenMsg+wcslen(fmt), 0); + Swprintf(what, fmt, msg); + HeapFree(GetProcessHeap(), 0, msg); + break; + } + case WININET: + { + DWORD code = GetLastError(); + if (code == ERROR_INTERNET_EXTENDED_ERROR) { + DWORD lenMsg; + InternetGetLastResponseInfo(&code, nullptr, &lenMsg); + std::wstring msg(lenMsg, 0); + if (InternetGetLastResponseInfoW(&code, msg.data(), &lenMsg)) { + what = std::wstring(lenMsg+wcslen(fmt), 0); + Swprintf(what, fmt, msg.c_str()); + EBMessageBox(msg, L"Test"); + } else + what = Err(WINDOWS, fmt).what; + } else { + wchar_t* wszMsg; + DWORD lenMsg = FormatMessageW( + FORMAT_MESSAGE_ALLOCATE_BUFFER + |FORMAT_MESSAGE_FROM_SYSTEM + |FORMAT_MESSAGE_FROM_HMODULE + |FORMAT_MESSAGE_IGNORE_INSERTS, + GetModuleHandle(L"wininet.dll"), + code, + MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), + (wchar_t*)&wszMsg, + 0, nullptr); + what = std::wstring(lenMsg+wcslen(fmt), 0); + Swprintf(what, fmt, wszMsg); + HeapFree(GetProcessHeap(), 0, wszMsg); + } + break; + } + case LIBXML2: + { + std::wstring msg = WideFromNarrow(xmlGetLastError()->message); + what = std::wstring(msg.size()+wcslen(fmt), 0); + Swprintf(what, fmt, msg.c_str()); + break; + } + } +} + +std::wstring What(std::exception_ptr ex) +{ + try { + std::rethrow_exception(ex); + } catch (const Err& e) { + return e.what; + } catch (const WideException& e) { + return e.What(); + } catch (const std::exception& e) { + return WideFromNarrow(e.what()); + } catch (...) { + return L"Unknown exception"; + } +} -- cgit v1.2.3