Python Koan 131 引发异常
最近我在通过做Python Koans来学习Python,遇到了一个关于在Python中抛出异常的问题。具体来说,我在学习完这个koan后,对try...except...
感到有些困惑。我知道有一个类似的问题是关于Rudy Koan的Ruby Koan 151 抛出异常。但是我还是个Python新手,对Ruby一无所知。
这是我遇到的koan:
# You need to finish implementing triangle() in the file 'triangle.py'
from triangle import *
class AboutTriangleProject2(Koan):
# The first assignment did not talk about how to handle errors.
# Let's handle that part now.
def test_illegal_triangles_throw_exceptions(self):
# Calls triangle(0, 0, 0)
self.assertRaises(TriangleError, triangle, 0, 0, 0)
self.assertRaises(TriangleError, triangle, 3, 4, -5)
self.assertRaises(TriangleError, triangle, 1, 1, 3)
self.assertRaises(TriangleError, triangle, 2, 4, 2)
以下是triangle.py的内容
def triangle(a, b, c):
# DELETE 'PASS' AND WRITE THIS CODE
if a == b and b == c and c == a:
return 'equilateral'
if a == b or b == c or a == c:
return 'isosceles'
else:
return 'scalene'
# Error class used in part 2. No need to change this code.
class TriangleError(StandardError):
pass
我需要完成triangle()
这个函数。
根据我的理解,try...except...
的作用就像是“如果满足某些条件就做某事,否则就抛出一个异常”。那么在我的情况下,我应该使用if ... then raise TriangleError
还是try... except ...
呢?它们之间有什么区别呢?
非常感谢!
5 个回答
1
这是我的代码,它可以正常运行。
def triangle(a, b, c):
# DELETE 'PASS' AND WRITE THIS CODE
if min([a,b,c])<=0:
raise TriangleError,"no <0 numbers"
if sorted([a,b,c])[0]+sorted([a,b,c])[1]<=sorted([a,b,c])[2]:
raise TriangleError,"sf"
set_a=set(([a,b,c]))
if len(set_a)==1:
return 'equilateral'
elif len(set_a)==2:
return 'isosceles'
elif len(set_a)==3:
return 'scalene'
# Error class used in part 2. No need to change this code.
class TriangleError(StandardError):
pass
1
你想使用“raise”这个命令,它会产生一个错误,然后这个错误会沿着调用的路径向上移动,直到有地方用“try/except”来处理这个错误。比如说,如果你在实际代码中使用这个三角形的函数,你可以这样做:
try:
t = triangle(x, y, z)
...
except TriangleError:
print 'Triangle', x, y, z, 'is no good!'
这样的话,当你创建了一个不合格的三角形时,就能处理这个错误,你的程序就不会崩溃了。
4
请看下面的回答:
def triangle(a, b, c):
# DELETE 'PASS' AND WRITE THIS CODE
if min([a,b,c])<=0:
raise TriangleError
x,y,z = sorted([a,b,c])
if x+y<=z:
raise TriangleError
if a==b and b==c and c==a:
return 'equilateral'
if a==b or b==c or a==c:
return 'isosceles'
else:
return 'scalene'