首页 > 解决方案 > 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]]

即使我用错误的输入初始化对象!更准确地说,代码打印“错误!” 只有当我使用错误的输入时,它才会打印(以前使用的)好的输入。

显然,我在这里遗漏了一些非常基本的问题,但我无法弄清楚它是什么。

标签: pythonexception

解决方案


代替

except WrongAsterism:
    print("Error!")
    sys.exit()

你需要有

except WrongAsterism as err:
    print(err)
    sys.exit()

推荐阅读