我想将错误的名称和回溯详细信息保存到变量中.这是我的尝试.
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]对象的用法.
给定一个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来评估一些测量数据.由于许多可能的结果,难以处理或可能的组合.有时在评估期间会发生错误.它通常是索引错误,因为我超出了测量数据的范围.
很难找到问题发生在代码中的哪个位置.如果我知道错误被引发到哪一行,那将会有很大帮助.如果我使用以下代码:
try:
result = evaluateData(data)
except Exception, err:
print ("Error: %s.\n" % str(err))
Run Code Online (Sandbox Code Playgroud)
不幸的是,这只能告诉我存在索引错误.我想知道有关异常的更多细节(代码行,变量等),以了解发生了什么.可能吗?
谢谢.
从这个问题来看,我现在正在进行一级错误处理.也就是说,我调用一个调用另一个更大函数的函数,我希望它在更大的函数中失败,而不是在较小的函数中.具体的例子.代码是:
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) 我有一个存储在字符串中的函数,它看起来像这样:
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 代码,我想指出发生错误的行号。根据此处询问的帖子,代码给出了被调用函数的行号。例如
if __name__ == '__main__':
try:
foo()
except:
<the code to print line no when error occurs>
Run Code Online (Sandbox Code Playgroud)
但它给了我 foo() 的行号,请帮助找到发生错误的确切行号。
谢谢,
我有一个数据库模式,可以在各种不同的数据库引擎中实现(假设我将使用 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中异常的行号?
以下代码的输出
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)