在python中获取异常类名称?

时间:2016-04-28 17:35:55

标签: python exception-handling

我想在异常处理程序中生成一个字符串,该异常处理程序包含异常的名称,以及传递的任何参数...很多是使用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)))

1 个答案:

答案 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);
}