我想在异常处理程序中生成一个字符串,该异常处理程序包含异常的名称,以及传递的任何参数...很多是使用Traceback获得的最终输出。
例如,如果调用date('d - m - Y', strtotime($date . ' +1 years'));
,则在异常处理程序中,我想生成字符串:raise bar.FnordError("message")
我希望它适用于内置异常,以及当前和其他模块中的异常。这就是我想出来的,但它似乎不是非常pythonic。
"bar.FnordError: message"
我已经挖掘了python中的BaseException C代码和Traceback标准库。我似乎错过了正确的“好”访问者。
def this_is_lame(err):
if type(err).__module__ in ['__main__', 'builtins']:
return "{}: {}".format(type(err).__name__, err)
else:
return "{}.{}: {}".format(type(err).__module__, type(err).__name__, err)
是否记录在案?它有逃脱吗?
我在翻译中玩过,并没有给我任何我想要的东西。
BaseException.__format__
产生:
import sys
import traceback
import bar
try:
raise bar.FnordError("message")
except Exception as err:
print(type(err))
print(repr(err))
print(type(err).__module__)
print(type(err).__name__)
print(err)
print("this is what I want: '{}'".format(this_is_lame(err)))
print()
try:
raise ValueError("message")
except Exception as err:
print(type(err))
print(repr(err))
print(type(err).__module__)
print(type(err).__name__)
print("this is what I want: '{}'".format(this_is_lame(err)))
答案 0 :(得分:2)
没有"很好"访问。 Python本身的功能与您在默认sys.excepthook
中执行的功能非常类似,但__main__
中定义的例外情况打印为__main__.WhateverException
。
如果你想看看Python本身是如何做到的,在Python 2上,检查发生在PyErr_Display
,检查strcmp(modstr, "exceptions")
:
moduleName = PyObject_GetAttrString(exception, "__module__");
if (moduleName == NULL)
err = PyFile_WriteString("<unknown>", f);
else {
char* modstr = PyString_AsString(moduleName);
if (modstr && strcmp(modstr, "exceptions"))
{
err = PyFile_WriteString(modstr, f);
err += PyFile_WriteString(".", f);
}
Py_DECREF(moduleName);
}
在Python 3上,print_exception
检查_PyUnicode_CompareWithId(moduleName, &PyId_builtins)
。
moduleName = _PyObject_GetAttrId(type, &PyId___module__);
if (moduleName == NULL || !PyUnicode_Check(moduleName))
{
Py_XDECREF(moduleName);
err = PyFile_WriteString("<unknown>", f);
}
else {
if (_PyUnicode_CompareWithId(moduleName, &PyId_builtins) != 0)
{
err = PyFile_WriteObject(moduleName, f, Py_PRINT_RAW);
err += PyFile_WriteString(".", f);
}
Py_DECREF(moduleName);
}