您的代码段不应引发任何异常。也许你想做类似的事情
try:
if g > h:
print 'Hey'
else:
raise NotImplementedError('This condition is not handled here!')
except Exception as e:
# ...
另一种可能性是您的意思是:
try:
assert g > h
print 'Hey!'
except AssertionError as e:
# ...
该assert
关键字的行为基本上类似于“故障安全”。如果条件为假,则会引发AssertionError
异常。它通常用于检查函数参数的先决条件。(假设一个值需要大于零才能使函数有意义。)
编辑:
异常是代码中的一种“信号”,它停止程序正在执行的任何操作,并找到最近的“异常处理程序”。每当您的程序中发生异常时,所有执行都会立即停止,并尝试转到最近except:
的代码部分。如果不存在,则程序崩溃。尝试执行以下程序:
print 'Hello. I will try doing a sum now.'
sum = 3 + 5
print 'This is the sum: ' + str(sum)
print 'Now I will do a division!'
quotient = 5/0
print 'This is the result of that: ' + str(quotient)
如果你运行它,你会看到你的程序崩溃了。我的 Python 告诉我:
ZeroDivisionError: integer division or modulo by zero
这是一个例外!发生了异常的事情!当然,你不能除以零。如您现在所知,此异常是一种信号,可以找到最近的exception:
块或异常处理程序。我们可以重写这个程序,让它更安全。
try:
print 'Hello. I will try doing a sum now.'
sum = 3 + 5
print 'This is the sum: ' + str(sum)
print 'Now I will do a division!'
quotient = 5/0
print 'This is the result of that: ' + str(quotient)
except Exception as e:
print 'Something exceptional occurred!'
print e
现在我们捕获异常,即发生异常的信号。我们将信号放入变量中e
并打印它。现在您的程序将导致
Something exceptional occurred!
integer division or modulo by zero
当ZeroDivisionError
异常发生时,它会在该位置停止执行,并直接转到异常处理程序。如果我们愿意,我们也可以手动引发异常。
try:
print 'This you will see'
raise Exception('i broke your code')
print 'This you will not'
except Exception as e:
print 'But this you will. And this is the exception that occurred:'
print e
raise
关键字手动发送异常信号。有不同类型的异常,例如ZeroDivisionError
异常、AssertionError
异常、NotImplementedError
异常等等,但我将这些留待进一步研究。
在您的原始代码中,没有发生任何异常,这就是为什么您从未见过异常被触发的原因。如果要根据条件(如g > h
)触发异常,可以使用assert
关键字,其行为有点像raise
,但仅在条件为假时引发异常。所以如果你写
try:
print 'Is all going well?'
assert 3 > 5
print 'Apparently so!'
except AssertionError as e:
print 'Nope, it does not!'
你永远不会看到“显然是这样!” 消息,因为断言是假的,它会触发异常。断言有助于确保值在您的程序中有意义,并且如果它们没有,您希望中止当前操作。
(请注意,我AssertionError
在异常处理代码中明确捕获了 。这不会捕获其他异常,只会捕获AssertionError
s。如果您继续阅读有关异常的内容,您将立即了解这一点。现在不要太担心它们。)