我正在尝试执行这个简单的exceptiion处理程序,但由于某种原因它不会起作用。我希望它抛出异常并将错误写入文件。
fileo = "C:/Users/bgbesase/Documents/Brent/ParsePractice/out.txt"
g = 4
h = 6
try:
if g > h:
print 'Hey'
except Exception as e:
f = open(fileo, 'w')
f.truncate()
f.write(e)
f.close()
print e
任何想法我做错了什么?
答案 0 :(得分:5)
您的代码段不应引发任何异常。也许你想做类似
的事情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
关键字的行为基本上类似于“故障安全”。如果条件为false,则会引发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。如果你继续阅读,你会很快得到它例外。现在不要过多担心它们。)
答案 1 :(得分:3)
你实际上并没有提出异常。要引发异常,您需要将raise
关键字与Exception
类或Exception
类的实例一起使用。在这种情况下,我会推荐ValueError
,因为你的价值很低。
fileo = "C:/Users/bgbesase/Documents/Brent/ParsePractice/out.txt"
g = 4
h = 6
try:
if g > h:
raise ValueError('Hey')
except Exception as e:
f = open(fileo, 'w')
f.truncate()
f.write(str(e))
f.close()
print e