- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我写了一个我不想在堆栈跟踪中显示的装饰器。所以在 Python2 中我会这样做:
class SneakyDecorator(object):
def __init__(self, f):
self.f = f
def __call__(self, *args, **kwargs):
# [...]
try:
self.f(*args, **kwargs)
except:
t, v, tb = sys.exc_info()
raise v, None, tb.tb_next # <=== Important line
在 Python3 中我会这样做:
class SneakyDecorator:
def __init__(self, f):
self.f = f
def __call__(self, *args, **kwargs):
# [...]
try:
self.f(*args, **kwargs)
except:
t, v, tb = sys.exc_info()
raise v.with_traceback(tb.tb_next) # <=== Important line
所以问题来了:有什么方法可以同时兼容 Python2 和 Python3 吗?我更喜欢不涉及两个独立代码库的解决方案。
我尝试使用 six
模块的 reraise
函数,但问题是,该函数随后出现在堆栈跟踪中。
同样的问题,如果你像在这个答案中那样做:Exception with original traceback - 2.6-3.X compatible version .
更新:Python3 代码不起作用!调用方法仍然显示在堆栈跟踪中。所以后续问题是:有没有办法在 Python3 中做到这一点?
最佳答案
使这项工作有效的唯一方法是保持 __call__
方法的不同版本,因为 exec 本身会创建一个堆栈框架!以下,在 Python 2 中再次显示框架:
class SneakyDecorator:
def __init__(self, f):
self.f = f
def __call__(self, *args, **kwargs):
# [...]
try:
self.f(*args, **kwargs)
except:
t, v, tb = sys.exc_info()
exec("raise v, None, tb.tb_next")
结果:
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 12, in __call__
File "<stdin>", line 3, in f
ValueError: Oi!
所以使用:
def __call__(self, *args, **kwargs):
# [...]
try:
self.f(*args, **kwargs)
except:
t, v, tb = sys.exc_info()
if sys.version_info[0] <= 2:
exec("raise v, None, tb.tb_next")
else:
raise v.with_traceback(tb.tb_next)
实际上不会工作。
对于 Python 2,以下内容与您的两个独立类具有完全相同的功能:
if sys.version_info[0] <= 2:
_call = '''\
def _call(self, *args, **kwargs):
# [...]
try:
self.f(*args, **kwargs)
except:
t, v, tb = sys.exc_info()
raise v, None, tb.tb_next
'''
exec(_call)
else:
def _call(self, *args, **kwargs):
# [...]
try:
self.f(*args, **kwargs)
except:
t, v, tb = sys.exc_info()
raise v.with_traceback(tb.tb_next)
class SneakyDecorator:
def __init__(self, f):
self.f = f
__call__ = _call
# niceties, patch up name and qualified name. Optional.
__call__.__name__ = '__call__'
__call__.__qualname__ = 'SneakyDecorator.__call__'
但是,请注意,对于 Python 3,Exception.with_traceback()
方法可能允许您在删除当前帧的情况下附加一个新的回溯,但 Python 会将其添加回去 在您重新引发异常的那一刻!
关于从 stacktrace 中隐藏装饰器的 Python 2 和 3 兼容方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23765707/
我希望这个问题能够在 SO 的规则下存活下来,因为我进行了很多搜索,没有找到关于它的文档,有时甚至忽略了它,但这让我既不理解问题也不理解解决方案。 Exceptoion 的 StackeTrace 有
我正在Gradle项目中设置Spotbugs,但是当我运行它时,Spotbugs会生成输出报告,但是将失败的堆栈跟踪记录到控制台。我想知道是否有办法抑制它。 这是我的Gradle文件: buildsc
这是我执行类的主要方法的任务,该类在Java项目的build.gradle中定义: task(runClass, type: JavaExec) { try { main =
我遇到了一个意外错误,它创建了包含大量行和不同库的 stackTrace。如果从上到下阅读,可以看到除了第2-3个方法之外的每个被调用的方法。看起来像 //Pseudo code method1_1(
我正在尝试将 gradle java 应用程序部署到 heroku (基于 jhipster)。我可以使用“heroku local”在本地构建并运行它,但是当我尝试远程部署它时,当它尝试构建应用程序
以下异常: Exception in thread "main" java.lang.NullPointerException at javaapplication7.App.main(App.jav
我需要按关键字从日志文件中 grep 完整的堆栈跟踪。 这段代码工作正常,但在大文件上会变慢(比文件更慢)。 我认为改进正则表达式以查找关键字的最佳方法,但我无法完成。 #!/usr/bin/perl
我在托管应用程序中收到错误消息,我正在尝试了解错误发生的原因。 为此,我查看了错误页面上的堆栈跟踪,如下所示: [ NullReferenceException: Object reference n
我的日志库中有这段代码 var stackTrace = new StackTrace(); string operationName = stackTrace.GetFrame(1).GetMeth
我们正在运行多个 Sitecore 网站,并且刚刚收到反馈,在出现错误时向网站用户提供堆栈跟踪可能很危险。既然人们获得了堆栈跟踪信息,该网站是否会更容易受到黑客攻击? 最佳答案 这绝对是弊大于利。根据
我们正在使用 Rational Application Developer 7.5(基于 Eclipse 3.4)为 WebSphere Application Server 6.1 开发一个 Web
给定以下流畅的 API 调用: Foo() .Bar1(() => { ... }) .Bar2(() => { ... }) .Bar3(); 我想稍后确定代码文件和 Bar
在我使用 StackTrace 的代码中发生了一些奇怪的事情。几乎就像没有加载调试信息一样......但我正在 DEBUG 构建上运行它。.pdb 文件肯定在 bin 目录中并且是最新的。我的想法真的
我不断收到此错误,我似乎在网上找不到任何帮助。我是flutter和android studio的新手。非常感谢任何帮助 FAILURE:构建失败并出现异常。 Where: Build file 'C:
在我的项目的目标目录中,有一个名为 stacktrace.log 的文件。我已经意识到文件的大小已经超过 3 GB。删除这个文件对我来说安全吗?删除后是否会导致任何文件未找到异常?谢谢你的时间。 -
我知道 http://richhickey.github.com/clojure/clojure.stacktrace-api.html . 有没有办法在不抛出异常并捕获它的情况下获取当前的堆栈跟踪?
我有一个异常记录器,它将所有异常记录到日志文件中: class function TLogger.LogException (ACaller: String; E: Exception): Boole
有时我在jQuery UI js文件的一行中收到错误或未处理的异常。我知道问题是一个空或空的对象或属性传递给jQuery。例如,在Chrome浏览器中,我收到“未捕获的TypeError”错误。 做一
我只是通过使用全局函数(在我的情况下称为GetCallingMethod)进行了一些分析。 通常情况下,它的效果很好。但是在某些情况下,应用程序被阻止。当关闭应用程序时,它被阻止。在Visual St
我正在分析遗留应用程序中的错误,同时清理并改进它。我有一些堆栈跟踪被记录到数据库中,但是它存储的量有一个限制 (VARCHAR2(1000)),并且错误发生在 System.Data 的深处.....
我是一名优秀的程序员,十分优秀!