示例#1
0
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>";
}
示例#2
0
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();
}
示例#4
0
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());
}