void RequestError::fallbackErrorPage(Request* request, const Exception& e, const String& e2Name) { if (!request->headersSent()) { request->setStatus(500); request->sendHeaders(); } request->stream() << "<h1>“" << e.type().htmlEscape() << "” exception</h1>" << "<p>" << e.htmlMessage() << "</p>" << "<p><strong>Additionally, a “" << e2Name << "” exception was encountered while handling the " << "exception.</strong></p>" << "<h2>Stack trace</h2><ol start=\"0\">"; List<StackTrace::Frame> stack = e.stackTrace()->stackFrames(); for (const StackTrace::Frame& frame : stack) { request->stream() << "<li><strong><code>" << frame.function.htmlEscape() << "</code></strong> (<code>0x" << String::fromNumber(frame.address, 16) << "</code>)<br />" << "<small>in <code>" << frame.object.relativePath() << "</code>, file <code>" << frame.fileName << "</code>, line " << frame.line << "</small></li>"; } request->stream() << "</ol>"; }
void RequestError::exception(Request* request, Exception& e) { int code = 500; if (e.type() == "NotFound") code = 404; else if (e.type() == "Forbidden") code = 403; if (code == 404) System::log("NotFound", e.message(), request->ip()); else if (code == 403) System::log("Forbidden", e.message(), System::Warning, request->ip()); else System::log("Exceptions", String("“%1” exception: %2.").format({e.type(), e.message()}), System::Warning, request->ip()); #ifndef DEBUG if (!request->headersSent()) request->setStatus(code); Template* tpl = new Template("Errors/" + String(code) + ".html", nullptr, request); tpl->render(); delete tpl; return; #endif try { View tpl = new Template("Sys::Exception.html", nullptr, request); tpl["exceptionName"] = e.type(); tpl["exceptionMessage"] = e.htmlMessage(); tpl["webcppVersion"] = System::get()->version(); tpl["serverName"] = request->env("SERVER_NAME", ""); loadStackTrace(e, dynamic_cast<Template*>(*tpl)); if (!request->headersSent()) request->setStatus(500); tpl->render(); } catch (const Exception& e2) { fallbackErrorPage(request, e, e2.type()); } catch (const std::exception& e2) { fallbackErrorPage(request, e, typeid(e2).name()); } }
QDebug operator<<(QDebug debug, const Exception &exception) { debug.nospace() << "Exception: " << exception.type() << "\n" "Function: " << exception.function() << "\n" "File: " << exception.file() << "\n" "Line: " << exception.line() << "\n"; if (!exception.description().isEmpty()) debug.nospace() << exception.description(); if (!exception.backTrace().isEmpty()) debug.nospace() << exception.backTrace(); return debug.space(); }
static void translate( const Exception &e ) { std::string s = (boost::format("%1% : %2%") % e.type() % e.what()).str(); PyErr_SetString(PyExc_RuntimeError, s.c_str()); }