Python 3很整洁
try:
raise OneException('sorry')
except OneException as e:
# after a failed attempt of mitigation:
raise AnotherException('I give up') from e
Run Code Online (Sandbox Code Playgroud)
允许在不丢失上下文的情况下引发后续异常的语法.我在Python 2中可以提出的最好的比喻是
raise AnotherException((e,'I give up')), None, sys.exc_info()[2]
Run Code Online (Sandbox Code Playgroud)
这(e,'')是一个丑陋的黑客,它将原始异常的名称包含在消息中.但是不是有更好的方法吗?
我在微软实践测试中遇到了这个问题,我感到很困惑.这是一个问题:
假设已声明了Alarm事件,AlarmEventArgs类和AlarmEventHandler委托,以下哪个C#代码示例是引发事件的正确方法?
以下是他们提供的"正确"答案:
AlarmEventArgs e = new AlarmEventArgs(1, 2);
AlarmEventHandler handler = Alarm;
if (handler != null)
{
handler(this, e);
}
Run Code Online (Sandbox Code Playgroud)
但是,还有另一个看似正确的答案.
AlarmEventArgs e = new AlarmEventArgs(1, 2);
if (Alarm!= null)
{
Alarm (this, e);
}
Run Code Online (Sandbox Code Playgroud)
我个人总是使用第二种方法.它工作得很好.有人可以告诉我为什么我应该使用第一种方法而不是第二种方法?
我想知道从C++/CLI引发事件的正确方法是什么.在C#中,我应首先制作处理程序的副本,检查它是否为空,然后调用它.C++/CLI有类似的做法吗?
我知道这可能并不重要,但我想知道什么是正确的.
如果一段代码包含某些版本的throw new SomeKindOfException().我们是否说这段代码可能引发异常?或抛出异常?
关键字是throw,所以我倾向于那个,但提出异常也被大量使用...
他们有某种不同的含义吗?他们中的一个是否与另一个有所不同?或者它只是两个词意味着完全相同的东西?
我正在尝试通过使用以下代码将它冒泡到Visual树中来引发MouseLeftButtonDownEvent.
MouseButtonEventArgs args = new MouseButtonEventArgs(Mouse.PrimaryDevice,0, MouseButton.Left);
args.RoutedEvent = UIElement.MouseLeftButtonDownEvent;
args.Source = this;
RaiseEvent(args);
Run Code Online (Sandbox Code Playgroud)
由于某种原因,较高级别的组件未收到此冒泡事件.我是否忽略了某些事情或者是否无法举起这个鼠标事件
我想知道在python中是否有可能在一个除了块之外引发异常并在稍后的块中捕获它.我相信其他一些语言默认会这样做.
这就是它的样子"
try:
something
except SpecificError as ex:
if str(ex) = "some error I am expecting"
print "close softly"
else:
raise
except Exception as ex:
print "did not close softly"
raise
Run Code Online (Sandbox Code Playgroud)
我希望在else子句中使用raise来触发final语句.
实际上我不打印任何东西,只记录它,我想记录更多的情况,这是我不期望的错误消息.但是,这个额外的日志记录将包含在最终的日志中.
我相信一个解决方案是创建一个函数,如果它没有软关闭,在最后的except和else子句中调用.但这似乎没必要.
我想知道关于在没有参数的情况下引发异常的最佳实践.在官方python文档中,您可以看到:
try:
raise KeyboardInterrupt
Run Code Online (Sandbox Code Playgroud)
(http://docs.python.org/tutorial/errors.html第8.6章)
在一些不同的代码中,比如Django或Google代码,你可以看到:
def AuthenticateAndRun(self, username, password, args):
raise NotImplementedError()
Run Code Online (Sandbox Code Playgroud)
(http://code.google.com/p/neatx/source/browse/trunk/neatx/lib/auth.py)
在没有参数的情况下,异常是在被提升之前实例化的.没有参数实例化异常的目的是什么?什么时候应该使用第一种情况或第二种情况?
在此先感谢Fabien
我目前正在创建我的第一个Android应用程序,并想知道设置一个cardview升高然后扩展到一个更大的矩形,揭示一个新的片段是什么方法?
编辑:(无论原始卡位于何处,新片段都会填满屏幕的中间三分之一)
file1 需要file2,我希望能够file2在某些条件下取消评估而不退出整个过程.
# file1.rb
puts "In file 1"
require 'file2'
puts "Back in file 1"
# file2.rb
puts "In file 2"
# return if some_conditional
puts "Still in file 2"
Run Code Online (Sandbox Code Playgroud)
运行时file1,我想看到的输出是:
In file 1
In file 2
Back in file 1
Run Code Online (Sandbox Code Playgroud)
目标是Still in file 2永不打印,同时Back in file 1打印.我能做些什么才能做到file2这一点?
我无法使用exit/ exit!/ abort这里,因为Back in file 1永远不会打印.我可以使用raise/ fail,但为了做到这一点,我将不得不改变file1和rescue …
Python的文档说:
如果不存在任何表达式,请
raise重新引发当前作用域中活动的最后一个异常。
(Python 3:https://docs.python.org/3/reference/simple_stmts.html#raise; Python 2.7:https://docs.python.org/2.7/reference/simple_stmts.html#raise。)
但是,“上次激活”的概念似乎已经改变。见证以下代码示例:
#
from __future__ import print_function
import sys
print('Python version =', sys.version)
try:
raise Exception('EXPECTED')
except:
try:
raise Exception('UNEXPECTED')
except:
pass
raise # re-raises UNEXPECTED for Python 2, and re-raises EXPECTED for Python 3
Run Code Online (Sandbox Code Playgroud)
这会导致我在Python 2中出乎意料的事情:
Python version = 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)]
Traceback (most recent call last):
File "./x", line 10, in <module>
raise Exception('UNEXPECTED')
Exception: …Run Code Online (Sandbox Code Playgroud)