【问题标题】:Exception handling in __init__ method__init__ 方法中的异常处理
【发布时间】:2018-08-19 09:32:18
【问题描述】:
我是一个初学者,只是在解决一个问题。如果使用字符串参数传递对象,我必须引发异常,但该程序的输出为空白。有人可以帮忙吗?
class RadiusInputError(Exception):
pass
class Circle:
def __init__(self,radius):
self.radius=radius
if type(self.radius) == "<class 'str'>":
raise RadiusInputError
try:
a = Circle('Hello')
except RadiusInputError:
print("'Hello' is not a number.")
【问题讨论】:
标签:
python
python-3.x
class
exception-handling
【解决方案1】:
检查您创建的对象的数据类型,而是尝试以以下格式编写:
class RadiusInputError(Exception):
pass
class Circle:
def __init__(self,radius):
self.radius=radius
try:
if not isinstance(self.radius, int):
raise RadiusInputError
except RadiusInputError:
print("'hello' is not a number.")
a = Circle('hello')
【解决方案2】:
class CustomError(Exception):
pass
class Circle:
def __init__(self,radius):
self.radius=radius
result = isinstance(self.radius, str)
if result == True:
raise CustomError
try:
a = Circle('Hello')
except CustomError:
print("'Hello' is not a number.")
【解决方案3】:
你真的不应该以这种方式检查类型
您的代码不起作用的原因是:
>>> type(type(str))
<class 'type'>
>>> type(str)
<class 'type'>
如您所见,type(str) 的打印表示看起来像一个可以比较的字符串,但表达式 type(self.radius) == "<class 'str'>": 将左侧的 type 与右侧的 str 进行比较永远不会评估为真。检查某事物是否为特定类型的方法是使用isinstance,如下所示:
class RadiusInputError(Exception):
pass
class Circle:
def __init__(self,radius):
self.radius = radius
if isinstance(self.radius, str):
raise RadiusInputError
try:
a = Circle('Hello')
except RadiusInputError:
print("'Hello' is not a number.")
这按预期工作,您的其余代码都很好,只需更改类型检查即可。