处理程序在处理错误后不执行



我需要创建函数来执行三角面积的计算,其中包括使用异常进行错误处理。

Def 1:函数名为checkTriangleEdges(a, b, c),验证:

  1. 三个参数均大于0,
  2. ,如果这三个参数可以形成一个三角形。引发ValueError异常,并给出错误消息"所有三角形边必须是>如果条件1为

Def 2:函数requestTriangleEdges(),使用input()函数获得3并使用checkTriangleEdges(a, b, c)函数检查它们。如果出现异常发生时,函数必须打印错误信息并重复,直到获得有效的三角形边缘。返回获得的有效三角形边作为元组。

Def 3:名为calculateTriangleArea()的函数,使用requestTriangleEdges()获得有效从用户和三角形边计算并返回三角形面积。

import math
def checkTriangleEdges(a, b, c):
if a<=0 or b<=0 or c<=0:
raise ValueError("All triangle edges must be > 0")
if a+b<c or b+c<a or c+a<b:
raise ValueError("a, b and c can not form a triangle")
def requestTriangleEdges():
try:
a = float(input("Length of edge a: "))
b = float(input("Length of edge b: "))
c = float(input("Length of edge c: "))
checkTriangleEdges(a, b, c)
return (a, b, c)
except ValueError as e:
print(e)
requestTriangleEdges()
def calculateTriangleArea():
a, b, c = requestTriangleEdges()
p = (a + b + c) / 2
s = p * (p - a) * (p - b) * (p - c)
result = math.sqrt(s)
return print(result)
calculateTriangleArea()

问题是,当我检查程序并立即输入不暗示错误的数据时,一切正常,但是当我输入暗示错误的数据时,一切正常,直到我输入正确的值,程序给出错误

输出示例:

在所有数据正确的情况下:

Length of edge a: 3
Length of edge b: 3
Length of edge c: 3
3.897114317029974

处理错误后

Length of edge a: x
could not convert string to float: 'x'
Length of edge a: 3
Length of edge b: 10
Length of edge c: 1
a, b and c can not form a triangle
Length of edge a: 0
Length of edge b: 1
Length of edge c: 3
All triangle edges must be > 0
Length of edge a: 4
Length of edge b: 4
Length of edge c: 4
Traceback (most recent call last):
File "C:UsersAlexDocumentsHTML5Fundamentals-S1tp7.py", line 42, in <module>
calculateTriangleArea()
File "C:UsersAlexDocumentsHTML5Fundamentals-S1tp7.py", line 32, in calculateTriangleArea
a, b, c = requestTriangleEdges()
TypeError: cannot unpack non-iterable NoneType object

我完全不明白我在哪里出错了,为什么程序不工作了。

不要对重复输入使用递归。使用while True循环,然后在获得有效输入后中断(或者在本例中返回)。

从函数中返回值,而不是在其中打印。

例如:

def checkTriangleEdges(a, b, c):
if a <= 0 or b <= 0 or c <= 0:
raise ValueError("All triangle edges must be > 0")
if a+b < c or b+c < a or c+a < b:
raise ValueError("a, b and c can not form a triangle")
return a, b, c
def requestTriangleEdges():
while True:
try:
a = float(input("Length of edge a: "))
b = float(input("Length of edge b: "))
c = float(input("Length of edge c: "))
return checkTriangleEdges(a, b, c)
except ValueError as e:
print(e)
def calculateTriangleArea():
a, b, c = requestTriangleEdges()
p = (a + b + c) / 2
s = p * (p - a) * (p - b) * (p - c)
return s**0.5
area = calculateTriangleArea()
print(area)

我对@Cobra的回答

一步一步地看看在这个代码片段中,当你首先犯了一个错误,然后给它一个有效的数据时,会发生什么:

def requestTriangleEdges():
try:
a = float(input("Length of edge a: "))
b = float(input("Length of edge b: "))
c = float(input("Length of edge c: "))
checkTriangleEdges(a, b, c)
return (a, b, c)
except ValueError as e:
print(e)
requestTriangleEdges()

出错,执行到

checkTriangleEdges(a, b, c)

在这里中断,异常块现在执行

print(e)
requestTriangleEdges()

好的,它打印了一个错误并再次运行requestTriangleEdges
这里是你需要理解的事情-当requestTriangleEdges运行时到底发生了什么,
你的错误是你认为requestTriangleEdges第二次运行时"停留"在同一个地方
就像这里

def requestTriangleEdges():
try:
a = float(input("Length of edge a: "))
b = float(input("Length of edge b: "))
c = float(input("Length of edge c: "))
checkTriangleEdges(a, b, c)
return (a, b, c)
except ValueError as e:
print(e)
requestTriangleEdges()

你可以在你的代码中看到它
这是错误的
当它第二次运行时它实际上是在这段代码中你看
更准确地说现在它在最后一行:

requestTriangleEdges()

当正常执行且没有错误时结束你的"最上层"(就递归而言)代码将被进一步执行我们记得最初的代码是在这行

checkTriangleEdges(a, b, c)

意味着这一行:

return (a, b, c)

没有执行
,在except块结束后,函数返回None(因为没有其他返回)
,因此您在这里得到一个错误

a, b, c = requestTriangleEdges()

a,b,c不能赋值给' None '

正如@Cobra所说,这个问题可以通过摆脱递归和使用While循环
来解决,但是为了理解你的代码是如何工作的,你可以改变这个Except块:

print(e)
requestTriangleEdges()

:

print(e)
return requestTriangleEdges()

和你的代码将会工作,因为现在它返回的不是None,而是a,b,c在最后一个rec深度级别
(但是对于用户输入使用递归真的是一个坏主意,堆栈不是无穷无尽的)

最新更新