我想创建一个类似于sys.exc_info()[2]返回的回溯.我不想要一个行列表,我想要一个实际的回溯对象:
<traceback object at 0x7f6575c37e48>
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我的目标是让它包含当前堆栈减去一帧,因此看起来呼叫者是最近的呼叫.
我可以解析Python回溯文件的路径,然后我可以-p
在命令行上使用它们将它们发送到Vim ,以便每个选项卡打开一个文件.所以我最终得到了一个命令,例如
vim -p main.py module.py another.py
Run Code Online (Sandbox Code Playgroud)
这将在新选项卡中打开每个文件,但我希望它们在新选项卡中以正确的行号打开.所以我尝试了类似的变化
vim -p main.py +10 module.py +20 another.py +30
Run Code Online (Sandbox Code Playgroud)
但我似乎无法让Vim尊重我在命令行发送的行号 - 它总是只取最后一行号并将其应用于第一个标签.所以这个例子让我排在main.py
第30行.尝试各种各样的变化
vim -p main.py+10 module.py+20 another.py+30
vim -p main.py\ +10 "module.py +20" another.py@30
Run Code Online (Sandbox Code Playgroud)
所有这些都只是以糟糕的文件名结束.
在Python,Bash命令行,Vim脚本或Vim-Python级别的答案都是受欢迎的.或者,确实是完全不同的方法
(追溯可以来自任何地方,并且不一定是我可以控制的.今天启动我的那个只是来自服务器的日志中的一组行.)
我在Python中创建的日志旨在临时存储为文件,然后将这些文件处理到日志数据库中.它们采用管道描述的格式来指示如何处理日志,但logging.exception()通过添加太多字段和太多新行来破坏我的标准.
import logging
logging.basicConfig(filename='output.txt',
format='%(asctime)s|%(levelname)s|%(message)s|',
datefmt='%m/%d/%Y %I:%M:%S %p',
level=logging.DEBUG)
logging.info('Sample message')
try:
x = 1 / 0
except ZeroDivisionError as e:
logging.exception('ZeroDivisionError: {0}'.format(e))
# output.txt
01/27/2015 02:09:01 PM|INFO|Sample message|
01/27/2015 02:09:01 PM|ERROR|ZeroDivisionError: integer division or modulo by zero|
Traceback (most recent call last):
File "C:\Users\matr06586\Desktop\ETLstage\Python\blahblah.py", line 90, in <module>
x = 1 / 0
ZeroDivisionError: integer division or modulo by zero
Run Code Online (Sandbox Code Playgroud)
如何使用空格和换行符最好地处理或格式化回溯?这些消息是logging.exception()中的一部分,但是当我尝试记录异常实例时,绕过函数感觉很奇怪.如何记录我的回溯并将其格式化?是否应该忽略追溯?
感谢您的时间!
假设我写了一个函数装饰器来获取该函数,并将其包装在另一个函数中,如下所示:
# File example-1.py
from functools import wraps
def decorator(func):
# Do something
@wraps(func)
def wrapper(*args, **kwargs):
# Do something
return func(*args, **kwargs)
# Do something
# Do something
return wrapper
Run Code Online (Sandbox Code Playgroud)
现在让我们假设我正在装饰的函数引发异常:
@decorator
def foo():
raise Exception('test')
Run Code Online (Sandbox Code Playgroud)
运行的结果foo()
将打印出以下回溯(在任何Python版本中):
Traceback (most recent call last):
File "./example-1.py", line 20, in <module>
foo()
File "./example-1.py", line 11, in wrapper
return func(*args, **kwargs)
File "./example-1.py", line 18, in foo
raise Exception('test')
Exception: test
Run Code Online (Sandbox Code Playgroud)
好的,现在我看看我的追溯,我看到它通过该wrapper
功能.如果我多次包装函数(假设有一个稍微复杂的装饰器对象在其构造函数中接收参数),该怎么办?如果我经常在我的代码中使用这个装饰器(我用它来记录,或分析,或其他什么)怎么办?
Traceback (most recent …
Run Code Online (Sandbox Code Playgroud) python中的一个常见模式是捕获上游模块中的错误,并将该错误重新引发为更有用的错误.
try:
config_file = open('config.ini', 'r')
except IOError:
raise ConfigError('Give me my config, user!')
Run Code Online (Sandbox Code Playgroud)
这将生成表单的堆栈跟踪
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
__main__.ConfigError: Give me my config, user!
Run Code Online (Sandbox Code Playgroud)
有没有办法访问包装的异常,以生成更像这样的堆栈跟踪?
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
__builtin__.IOError: File Does not exist.
Exception wrapped by:
File "<stdin>", line 4, in <module>
__main__.ConfigError: Give me my config, user!
Run Code Online (Sandbox Code Playgroud)
我试图打败的问题是,一些第三方代码可以包装异常最多3次,我希望能够确定根本原因,即检查异常堆栈并确定异常根本原因的通用方法无需向第三方模块添加任何额外代码.
我在Linux上用Python开发,从未真正看到过Windows的这类问题.我正在使用该multiprocessing
库来加速计算,这在Linux上非常适合我.
但是,在Windows上,事情并不顺利:
* [INFO] Parsing 1 file using 2 threads
Traceback (most recent call last):
File "main.py", line 170, in <module>
master = ParsingMaster(parser, list(input_file), output_list, threads=num_threads)
Traceback (most recent call last):
File "main.py", line 39, in __init__
File "<string>", line 1, in <module>
self.input_process.start()
File "C:\Python26\lib\multiprocessing\forking.py", line 342, in main
File "C:\Python26\lib\multiprocessing\process.py", line 104, in start
self._popen = Popen(self)
self = load(from_parent)
File "C:\Python26\lib\multiprocessing\forking.py", line 239, in __init__
File "C:\Python26\lib\pickle.py", line 1370, in load
dump(process_obj, to_child, HIGHEST_PROTOCOL) …
Run Code Online (Sandbox Code Playgroud) 这个漂亮的小Python装饰器可以配置禁用装饰功能:
enabled = get_bool_from_config()
def run_if_enabled(fn):
def wrapped(*args, **kwargs):
try:
return fn(*args, **kwargs) if enabled else None
except Exception:
log.exception('')
return None
return wrapped
Run Code Online (Sandbox Code Playgroud)
唉,如果在fn()
回溯中引发异常,则只显示包装器:
Traceback (most recent call last):
File "C:\my_proj\run.py", line 46, in wrapped
return fn(*args, **kwargs) if enabled else None
File "C:\my_proj\run.py", line 490, in a_decorated_function
some_dict['some_value']
KeyError: 'some_value'
Run Code Online (Sandbox Code Playgroud)
在阅读virtualenv时,我意识到我没有点差1.3+,所以我跑了pip install --upgrade pip
,现在当我跑步时pip --version
我得到以下内容:
Traceback (most recent call last):
File "/usr/local/bin/pip", line 5, in <module>
from pkg_resources import load_entry_point
File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/distribute-0.6.34-py2.7.egg/pkg_resources.py", line 2807, in <module>
parse_requirements(__requires__), Environment()
File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/distribute-0.6.34-py2.7.egg/pkg_resources.py", line 594, in resolve
raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: pip==1.2.1
Run Code Online (Sandbox Code Playgroud)
如果它有帮助,或者完全相关,我$PATH
看起来像这样:
/usr/local/bin:/usr/local/share/python:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin
Run Code Online (Sandbox Code Playgroud)
还有,which pip
给我/usr/local/bin/pip
.
不知道如何处理错误.谢谢.
我有一个捕获所有异常的函数,我希望能够在此函数中将回溯作为字符串.
到目前为止,这不起作用:
def handle_errors(error_type, error_message, error_traceback):
"""catch errors"""
import traceback
error = {}
error['type'] = error_type.__name__
error['message'] = str(error_message)
error['file'] = os.path.split(error_traceback.tb_frame.f_code.co_filename)[1]
error['line'] = error_traceback.tb_lineno
error['traceback'] = repr(traceback.print_tb(error_traceback))
### finalise error handling and exit ###
sys.excepthook = handle_errors
Run Code Online (Sandbox Code Playgroud)
这error['traceback']
是错误的界限.我甚至需要使用该traceback
模块吗?
根据另一个模糊相似的问题,我试过:
error['traceback'] = repr(error_traceback.print_exc())
Run Code Online (Sandbox Code Playgroud)
...但这会产生错误:
Error in sys.excepthook:
Traceback (most recent call last):
File "xxxxxxxxxxx", line 54, in handle_errors
error['traceback'] = repr(error_traceback.print_exc())
AttributeError: 'traceback' object has no attribute 'print_exc'
Run Code Online (Sandbox Code Playgroud) 我有以下Python脚本:
import http
import requests
from bs4 import BeautifulSoup
import urllib3
import pyrebase
import numpy as np
import yagmail
import time
from datetime import datetime, timedelta
import sys
import logging
import colorama
import csv
from random import randint
from numpy import genfromtxt
import sched, time
import threading
import http.client
import firebase_admin
from firebase_admin import credentials
from firebase_admin import db
# Fetch the service account key JSON file contents
cred = credentials.Certificate('service-account-credentials.json')
# Initialize the app with a service account, granting …
Run Code Online (Sandbox Code Playgroud) traceback ×10
python ×9
decorator ×2
python-3.x ×2
anaconda ×1
http ×1
line-numbers ×1
logging ×1
pickle ×1
pip ×1
python-2.x ×1
string ×1
tabs ×1
vim ×1