相关疑难解决方法(0)

如何在变量中保存traceback/sys.exc_info()值?

我想将错误的名称和回溯详细信息保存到变量中.这是我的尝试.

import sys
try:
    try:
        print x
    except Exception, ex:
        raise NameError
except Exception, er:
    print "0", sys.exc_info()[0]
    print "1", sys.exc_info()[1]
    print "2", sys.exc_info()[2]
Run Code Online (Sandbox Code Playgroud)

输出:

0 <type 'exceptions.NameError'>
1 
2 <traceback object at 0xbd5fc8>
Run Code Online (Sandbox Code Playgroud)

期望的输出:

0 NameError
1
2 Traceback (most recent call last):
  File "exception.py", line 6, in <module>
    raise NameError
Run Code Online (Sandbox Code Playgroud)

PS我知道这可以使用traceback模块轻松完成,但我想知道sys.exc_info()[2]对象的用法.

python exception-handling

111
推荐指数
4
解决办法
9万
查看次数

从异常对象中提取回溯信息

给定一个Exception对象(来源不明)有没有办法获得它的追溯?我有这样的代码:

def stuff():
   try:
       .....
       return useful
   except Exception as e:
       return e

result = stuff()
if isinstance(result, Exception):
    result.traceback <-- How?
Run Code Online (Sandbox Code Playgroud)

有了它,如何从Exception对象中提取回溯?

python debugging exception-handling

95
推荐指数
6
解决办法
5万
查看次数

Python异常处理 - 行号

我正在使用python来评估一些测量数据.由于许多可能的结果,难以处理或可能的组合.有时在评估期间会发生错误.它通常是索引错误,因为我超出了测量数据的范围.

很难找到问题发生在代码中的哪个位置.如果我知道错误被引发到哪一行,那将会有很大帮助.如果我使用以下代码:

try:
    result = evaluateData(data)
except Exception, err:
    print ("Error: %s.\n" % str(err))
Run Code Online (Sandbox Code Playgroud)

不幸的是,这只能告诉我存在索引错误.我想知道有关异常的更多细节(代码行,变量等),以了解发生了什么.可能吗?

谢谢.

python indexing exception

48
推荐指数
5
解决办法
6万
查看次数

当我捕获异常时,如何获取前一帧的类型,文件和行号?

这个问题来看,我现在正在进行一级错误处理.也就是说,我调用一个调用另一个更大函数的函数,我希望它在更大的函数中失败,而不是在较小的函数中.具体的例子.代码是:

import sys, os

def workerFunc():
    return 4/0

def runTest():
    try:
        print workerFunc()
    except:
        ty,val,tb = sys.exc_info()
        print "Error: %s,%s,%s" % (
            ty.__name__,
            os.path.split(tb.tb_frame.f_code.co_filename)[1],
            tb.tb_lineno)

runTest()
Run Code Online (Sandbox Code Playgroud)

输出是:

Error: ZeroDivisionError,tmp2.py,8
Run Code Online (Sandbox Code Playgroud)

但第8行是"print workerFunc()" - 我知道该行失败了,但我想要之前的行:

Error: ZeroDivisionError,tmp2.py,4
Run Code Online (Sandbox Code Playgroud)

python error-handling exception-handling exception

7
推荐指数
1
解决办法
475
查看次数

当代码是字符串中的 exec() 时,如何以编程方式获取回溯的行号?

我有一个存储在字符串中的函数,它看起来像这样:

func_str = "def <func_name> ..."
Run Code Online (Sandbox Code Playgroud)

我正在使用“exec”评估它并在输入上使用它,如下所示:

exec func_str in locals()
locals()[func_name](inp)
Run Code Online (Sandbox Code Playgroud)

现在这个函数可能有一个异常,我想知道字符串中哪一行导致了它。在解释器中运行它会给出一条错误消息,这正是我想要的:

  File "<string>", line 6, in <func_name>
TypeError: can only concatenate tuple (not "int") to tuple
Run Code Online (Sandbox Code Playgroud)

这告诉我字符串中的第六行导致了问题。

有什么方法可以以编程方式捕获这个吗?我看过类似的解决方案,但它们没有解决来自在本地范围内执行的字符串的异常。当尝试使用回溯模块时,我只获得了调用 exec 的外部函数的行号。

谢谢

python traceback

6
推荐指数
2
解决办法
4321
查看次数

Python 获取错误行号

我正在尝试调试 python 代码,我想指出发生错误的行号。根据此处询问的帖子,代码给出了被调用函数的行号。例如

    if __name__ == '__main__':
        try:
            foo()
        except:
            <the code to print line no when error occurs>
Run Code Online (Sandbox Code Playgroud)

但它给了我 foo() 的行号,请帮助找到发生错误的确切行号。

谢谢,

python-2.7 python-3.x

5
推荐指数
1
解决办法
4689
查看次数

一般捕获 python DatabaseErrors

我有一个数据库模式,可以在各种不同的数据库引擎中实现(假设我将使用 pyodbc 连接到 MS Access 数据库,或者我将通过内置 sqlite3 模块作为 SQLite 数据库连接到该数据库)简单的例子)。

我想创建一个工厂函数/方法,它根据某些参数返回适当类型的数据库连接,类似于以下内容:

def createConnection(connType, params):
    if connType == 'sqlite':
        return sqlite3.connect(params['filename'])
    elif connType == 'msaccess':
        return pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ={};'.format(params['filename']))
    else:
        # do something else
Run Code Online (Sandbox Code Playgroud)

现在我已经有了一些应该适用于任何连接类型的查询代码(因为无论底层数据库引擎如何,架构都是相同的),但可能会抛出一个我需要捕获的异常:

db = createDatabase(params['dbType'], params)

cursor = db.cursor()

try:
    cursor.execute('SELECT A, B, C FROM TABLE')
    for row in cursor:
        print('{},{},{}'.format(row.A, row.B, row.C))

except DatabaseError as err:
    # Do something...
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是每个 DB API 2.0 实现中的 DatabaseError 类不共享公共基类(除了过于通用的 Exception 之外),因此我不知道如何一般地捕获这些异常。显然我可以做如下的事情:

try:
    # as before
except sqlite3.DatabaseError as …
Run Code Online (Sandbox Code Playgroud)

python exception python-db-api

5
推荐指数
1
解决办法
2万
查看次数

Python异常中的行号

如何获取Python中异常的行号?


以下代码的输出

try:
    print("a" + 1)
except Exception as error_message:
    print("There was an error: " + str(error_message))
Run Code Online (Sandbox Code Playgroud)

There was an error: can only concatenate str (not "int") to str
Run Code Online (Sandbox Code Playgroud)

但不仅仅是打印

"There was an error: " + str(error_message)
Run Code Online (Sandbox Code Playgroud)

如何像这个例子一样打印行号

try:
    print("a" + 1)
except Exception as error_message and linenumber as linenumber:
    print("There was an error: " + str(error_message) + ". The line where the code failed was " + str(linenumber))
Run Code Online (Sandbox Code Playgroud)

预期输出为

There was an error: can only concatenate str (not …
Run Code Online (Sandbox Code Playgroud)

python exception

1
推荐指数
1
解决办法
4740
查看次数