基本异常处理

时间:2013-06-06 14:55:22

标签: python exception

我正在尝试执行这个简单的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

任何想法我做错了什么?

2 个答案:

答案 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