- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
以下是我在 Doug Hellman 网站上在名为“masking_exceptions_catch.py”的文件中找到的示例。我暂时找不到链接。 throws() 引发的异常被丢弃,而 cleanup() 引发的异常被报告。
在他的文章中,Doug 评论说处理是不直观的。在编写它时(大约 2009 年),我认为它是 Python 版本中的一个错误或限制,我在当前的 Mac 版 Python (2.7.6) 中运行了它。它仍然报告来自 cleanup() 的异常。我觉得这有点令人惊讶,并希望看到它实际上是如何正确或理想的行为的描述。
#!/usr/bin/env python
import sys
import traceback
def throws():
raise RuntimeError('error from throws')
def nested():
try:
throws()
except:
try:
cleanup()
except:
pass # ignore errors in cleanup
raise # we want to re-raise the original error
def cleanup():
raise RuntimeError('error from cleanup')
def main():
try:
nested()
return 0
except Exception, err:
traceback.print_exc()
return 1
if __name__ == '__main__':
sys.exit(main())
$ python masking_exceptions_catch.py
Traceback (most recent call last):
File "masking_exceptions_catch.py", line 24, in main
nested()
File "masking_exceptions_catch.py", line 14, in nested
cleanup()
File "masking_exceptions_catch.py", line 20, in cleanup
raise RuntimeError('error from cleanup')
RuntimeError: error from cleanup
最佳答案
回过头来回答。我先不回答你的问题。 :-)
这真的有效吗?
def f():
try:
raise Exception('bananas!')
except:
pass
raise
# python 3.3
4 except:
5 pass
----> 6 raise
7
RuntimeError: No active exception to reraise
# python 2.7
1 def f():
2 try:
----> 3 raise Exception('bananas!')
4 except:
5 pass
Exception: bananas!
def f():
try:
raise Exception('bananas!')
except Exception as e:
pass
raise e
# python 3.3
4 except Exception as e:
5 pass
----> 6 raise e
7
UnboundLocalError: local variable 'e' referenced before assignment
# python 2.7
4 except Exception as e:
5 pass
----> 6 raise e
7
Exception: bananas!
try:
1/0
except Exception as e:
x=4
#can I access `x` here after the exception block? How about `e`?
try
和
except
不是范围。实际上,python 中很少有东西;我们有“LEGB 规则”来记住四个命名空间——本地、封闭、全局、内置。其他块根本不是作用域;我可以愉快地声明
x
内
for
循环并期望在该循环之后仍然能够引用它。
raise
是您最初询问的问题,这些问题密切相关,但实际上并不相同。 Python 3 可能会强制命名异常的范围仅限于它们的块,而无需解决裸
raise
事物。
raise
做‽
raise
作为保留堆栈跟踪的一种手段。 catch ,做记录/清理,再加注。很酷,我的清理代码没有出现在回溯中,99.9% 的时间有效。但是当我们尝试在异常处理程序中处理嵌套异常时,事情可能会变糟。有时。 (有关何时/不是问题,请参见底部的示例)
raise
将正确处理嵌套的异常处理程序,并找出正确的“当前”异常以重新引发。但这并不完全是现实。原来 - 在这里进入实现细节 - 异常信息被保存为当前
frame object 的成员.在 python 2 中,根本没有管道来处理单个帧内堆栈上的推送/弹出异常处理程序;只是一个包含最后一个异常的字段,而不管我们可能对其进行了任何处理。这就是裸
raise
抢。
6.9. The raise statement
raise_stmt ::= "raise" [expression ["," expression ["," expression]]]
If no expressions are present, raise re-raises the last exception that was active in the current scope.
raise
重新提出当前框架认为是“最后一个”异常的异常,这不一定是我们人类大脑认为特定于我们当时所处的词法嵌套异常块的异常。呸,瞄准镜!
RuntimeError: error from cleanup
,您的示例代码引发
RuntimeError: error from throws
正如预期的那样。
sys.exc_info
的语义),这通常是一个很好的理由不在一个小版本。
nested
功能变为:
def nested():
try:
throws()
except BaseException as e:
try:
cleanup()
except:
pass
raise e
Traceback (most recent call last):
File "example", line 24, in main
nested()
File "example", line 17, in nested
raise e
RuntimeError: error from throws
raise
的 3 参数版本.很多人不知道这个,它是一种合法(如果笨重)的方式来保留您的堆栈跟踪。
def nested():
try:
throws()
except:
e = sys.exc_info()
try:
cleanup()
except:
pass
raise e[0],e[1],e[2]
sys.exc_info
给了我们一个包含 (type, value, traceback) 的 3 元组,这正是
raise
的 3 参数版本需要。请注意,此 3-arg 语法仅适用于 python 2。
try/except
出
nested
并转化为自己的功能。
def nested():
try:
throws()
except:
cleanup()
raise
def cleanup():
try:
cleanup_code_that_totally_could_raise_an_exception()
except:
pass
def cleanup_code_that_totally_could_raise_an_exception():
raise RuntimeError('error from cleanup')
nested
的范围,它不会干扰您打算重新加注的异常。
raise
就像你在阅读所有这些并接受它之前所做的那样;清理代码通常不会引发异常,对吗? :-)
关于python - 当前异常上下文掩盖了先前的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23707530/
出现以下错误 Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable D
在调试应用程序时出现以下错误。 The CLR has been unable to transition from COM context 0x3b2d70 to COM context 0x3b2
在 GAE Go 中,为了记录,我们需要使用 appengine.NewContext(r) 创建一个新的上下文,它返回 context.Context。 如何使用此上下文在请求范围内设置/获取变量?
我想使用 Puppeteer 从放置在页面上 iframe 内的选择器中获取数据,该页面在与其父框架域不同的域上运行。因此,我不是任何域的所有者 - 无法使用 frame.postMessage。 试
我正在尝试获取可用的应用程序上下文并想切换到 webview 上下文,但 appium 仅获取 Navive App。 应用程序还启用了 WebView。 Appium 版本:1.10.1 Chrom
这个问题在这里已经有了答案: How to fix this nullOk error when using the flutter_svg package? (7 个回答) 7 个月前关闭。 当我尝
我观看了关于 Core Data 的 2016 WWDC 视频并查看了各种教程。我见过使用 Core Data Framework 创建对象以持久保存到 managedObjectContext 中的
这是代码 obj = { a: 'some value'; m: function(){ alert(this.a); } } obj.m(); 结果是'som
我正在尝试做类似的事情 $(".className").click(function() { $(this).(".anotherClass").css("z-index","1");
var User = { Name: "Some Name", Age: 26, Show: function() { alert("Age= "+this.Age)}; }; fun
我目前正在使用我见过的常见 Context 模式,它允许子组件通过传递修饰函数来更新父组件的状态(即 Provider)通过共享的 Context。 我遇到的问题是,修改函数只引用原始状态,不引用最新
有没有办法让 React Context类型安全与流类型? 例如: Button.contextTypes = { color: React.PropTypes.string }; 最佳答案 不幸
我想知道是否有一种方法可以为不同的功能使用不同的上下文类。 我希望有一个功能使用 MinkExtensions 进行浏览器测试,另一个功能使用和 HTTP 客户端(如 Guzzle)进行 API 测试
我有这个配置文件 apiVersion: v1 clusters: - cluster: server: [REDACTED] // IP of my cluster name: stag
我在实现非抢先式调度时遇到了用于初始化TCB的代码。 typedef struct TCB_t { struct TCB_t *next; struct TCB_t
我想将一个函数设置为数组中每个元素的属性,但使用不同的参数调用它。我想我会使用匿名函数来解决它: for ( var i = 0; i < object_count; i++ ) { obje
这个问题已经有答案了: How to access the correct `this` inside a callback (15 个回答) 已关闭 7 年前。 我正在做一些练习,但我在管道方法中丢
我正在尝试通过 Java 和 Android Studio 学习和制作 Android 应用程序。我对Java的了解程度是两年前几个小时的youtube学习和大学基础类(class)。不过我确实知道如
我在(这个)上遇到了问题。错误ImageView无法应用。我在 fragment 类中执行此代码。 ViewFlipper v_flipper; @Nullable @Override public
我想使用 openGL 的某些功能,但与渲染视觉内容无关。有没有办法在没有任何依赖性的情况下创建它(不是对 Windows,也不是某些包[SDL,SFML,GLUT])?只允许使用没有外部库的库,就像
我是一名优秀的程序员,十分优秀!