Python Koan 131 引发异常

2 投票
5 回答
1966 浏览
提问于 2025-04-17 02:10

最近我在通过做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'    

撰写回答