python - Python中自定义异常的奇怪行为
问题描述
Python中有很多关于自定义异常的问题,但我找不到我的案例。
在 Python 3.7 中,我定义了一个Asterism
具有名称和二维点的 2 轴数组的类。构造函数必须能够验证输入,这意味着如果传递的数组没有 2 个轴或者不是由 2D 元素组成,它必须引发异常。我认为这是一个代码破坏错误,因此如果引发此异常,则必须终止执行。这是类的代码:
import sys
import numpy as np
class WrongAsterism(Exception):
def __init__(self, value):
self.message = value
def __str__(self):
return str(self.message)
class Asterism:
def __init__(self, name, points_array):
self.name = name
if(len(points_array.shape)!=2):
raise WrongAsterism("The asterism must be a 2-axes numpy array. Quitting.")
elif(points_array.shape[1]!=2):
raise WrongAsterism("The asterism must consist of 2D points. Quitting.")
else:
self.points = points_array
我想测试代码,所以我添加了以下几行:
try:
np.random.seed(6)
a = Asterism("Ursa Major", np.random.rand(9,2)*10-5)
except WrongAsterism:
print("Error!")
sys.exit()
print("The asterism name is {}.".format(a.name))
print("It has {} 2D points.".format(a.points.shape[0]))
print("Its points are:\n{}".format(a.points))
这个案例有一个正确的输入,所以我得到:
The asterism name is Ursa Major.
It has 9 2D points.
Its points are:
[[ 3.92860151 -1.68020195]
[ 3.21229123 -4.58303374]
[-3.9234332 0.95052064]
[ 0.29817362 -0.81192571]
[-1.64592151 1.22519432]
[-0.61858574 2.35882106]
[ 0.18036412 0.788586 ]
[ 1.45355096 4.90224271]
[ 3.19858197 -0.86799065]]
但是,如果我尝试使用错误的输入定义对象,例如使用 line a = Asterism("Ursa Major", np.random.rand(9,3)*10-5)
,其中数组有 2 个轴但点是 3D,或者使用a = Asterism("Ursa Major", np.random.rand(9,2,3)*10-5)
,其中数组有 3 个轴,在这两种情况下我都会得到
Error!
An exception has occurred, use %tb to see the full traceback.
SystemExit
而不是预期的错误消息。
根据类似问题中的指示,我尝试以WrongAsterism
两种替代方式重新定义该类,即
class WrongAsterism(Exception):
pass
和
class WrongAsterism(Exception):
def __init__(self, msg='My default message', *args, **kwargs):
super().__init__(msg, *args, **kwargs)
但没有任何改变。
所以,第一个问题是“如何获得所需的自定义错误消息?”
然而,我还有另一个问题让我很困惑。其中,我还尝试注释掉sys.exit()
,在这种情况下,我总是得到
Error!
The asterism name is Ursa Major.
It has 9 2D points.
Its points are:
[[ 3.92860151 -1.68020195]
[ 3.21229123 -4.58303374]
[-3.9234332 0.95052064]
[ 0.29817362 -0.81192571]
[-1.64592151 1.22519432]
[-0.61858574 2.35882106]
[ 0.18036412 0.788586 ]
[ 1.45355096 4.90224271]
[ 3.19858197 -0.86799065]]
即使我用错误的输入初始化对象!更准确地说,代码打印“错误!” 只有当我使用错误的输入时,它才会打印(以前使用的)好的输入。
显然,我在这里遗漏了一些非常基本的问题,但我无法弄清楚它是什么。
解决方案
代替
except WrongAsterism:
print("Error!")
sys.exit()
你需要有
except WrongAsterism as err:
print(err)
sys.exit()