From 0d5736538a98b2c4001c45d073affc6bc0d772e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Wed, 20 Jul 2022 20:15:22 +0200 Subject: Use GetLastError() as default for Win32Error. --- README | 4 ++++ c/common.cpp | 3 ++- c/common.h | 15 ++++++++------- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/README b/README index 77e46d6..ebe22ef 100644 --- a/README +++ b/README @@ -76,6 +76,10 @@ Following is a summary of some coding conventions used in the project. - wstr = ... (std::wstring) - tstr = ... (std::basic_string) +The list above is non-exhaustive. Variables whose type is unknown (in +templates) do not need prefixes. Some very common self-explanatory +variables also do not need prefixes, e.g. len (usually size_t). + ... TYPES ... Here are some general guidelines for choosing what types to use: diff --git a/c/common.cpp b/c/common.cpp index ba52f2c..25ff899 100644 --- a/c/common.cpp +++ b/c/common.cpp @@ -4,6 +4,7 @@ /* Win32Error: Exception for Windows API errors. */ +Win32Error::Win32Error() : m_dwErr(GetLastError()) {} Win32Error::Win32Error(const DWORD dwErr) : m_dwErr(dwErr) {} Win32Error::~Win32Error() @@ -48,7 +49,7 @@ Library::Library(const TCHAR* const tszLibrary) { m_hModule = LoadLibrary(tszLibrary); if (!m_hModule) - throw Win32Error(GetLastError()); + throw Win32Error(); } Library::~Library() diff --git a/c/common.h b/c/common.h index d84590d..24c98c8 100644 --- a/c/common.h +++ b/c/common.h @@ -15,6 +15,7 @@ int EBMessageBox(const TCHAR* tszText, const TCHAR* tszCaption, unsigned uType); struct Win32Error : public std::exception { + Win32Error(); Win32Error(DWORD dwErr); ~Win32Error(); template const T* what() const noexcept; @@ -57,19 +58,19 @@ std::optional maybe_make(U... xs) template inline auto require(T... xs) { - auto r = F(xs...); - if (!r) throw Win32Error(GetLastError()); - return r; + if (auto r = F(xs...)) return r; + else throw Win32Error(); } /* Call Windows API function, showing a warning on NULL. */ template inline auto prefer(T... xs) { - try { - return require(xs...); - } catch (Win32Error& e) { - EBMessageBox(e.what(), TEXT("System Error"), MB_ICONWARNING); + if (auto r = F(xs...)) + return r; + else { + EBMessageBox(Win32Error().what(), + TEXT("System Error"), MB_ICONWARNING); return (decltype(F(std::declval()...)))NULL; } } -- cgit v1.2.3