0

我试图只执行这个简单的异常处理程序,但由于某种原因它不起作用。我希望它抛出异常并将错误写入文件。

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

任何想法我做错了什么?

4

2 回答 2

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关键字的行为基本上类似于“故障安全”。如果条件为假,则会引发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在异常处理代码中明确捕获了 。这不会捕获其他异常,只会捕获AssertionErrors。如果您继续阅读有关异常的内容,您将立即了解这一点。现在不要太担心它们。)

于 2013-06-06T15:01:28.727 回答
3

你实际上并没有提出异常。要引发异常,您需要将raise关键字与Exception类或类的实例一起使用Exception。在这种情况下,我会推荐 aValueError因为你得到了一个不好的值。

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
于 2013-06-06T14:57:27.787 回答