在Python中使用内置str()类型的潜在异常
作者:互联网
在Python中使用内置类型(如int和float)时,通常在输入可能不可靠的情况下使用异常处理:
def friendly_int_convert(val):
"Convert value to int or return 37 & print an alert if conversion fails"
try:
return int(val)
except ValueError:
print('Sorry, that value doesn\'t work... I chose 37 for you!')
return 37
使用str()时是否有任何突出的边缘情况需要注意?
def friendly_str_convert(val):
"Convert value to str or return 'yo!' & print an alert if conversion fails"
try:
return str(val)
except Exception: # Some specific Exception here
print('Sorry, that value doesn\'t work... I chose \'yo!\' for you!')
return 'yo!'
我真的不喜欢使用广泛的Exception,因为有类似NameError的情况表示代码有问题并且应该引发错误.我已经将UnicodeError视为候选者,但我不确定str()是否会导致它(与foo.encode()和foo.decode()相比,它更容易理解)并且会喜欢输入的示例,如果任何,都会触发它.
总结:即使输入不可靠,使用str()而不使用try / except块通常是否安全?
解决方法:
在这方面,str和int之间存在巨大差异. int肯定会引发TypeError和ValueError.
据我所知,str可以为普通对象引发的唯一例外是UnicodeEncodeError:
>>> s = u"a\xac\u1234\u20ac\U00008000"
>>> str(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-4: ordinal not in range(128)
而这只发生在python2.x上.
当然,我可以轻松地创建一个失败的类,几乎可以想象任何异常:
>>> class MyError(Exception):
... pass
...
>>> class Foo(object):
... def __str__(self):
... raise MyError
...
>>> f = Foo()
>>> str(f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __str__
__main__.MyError
在大多数情况下,我会质疑一些隐含的假设,即此时需要处理所有异常.通常,最好只处理您知道如何处理的异常.在这种情况下,由于用户将垃圾放入函数中而发生的异常异常应该在垃圾进入的级别处理 – 而不是在函数本身内.捕获错误并返回一些可能是无意义的值对于调试问题等不会有太大的帮助.
标签:python,exception-handling,python-3-x,built-in,string 来源: https://codeday.me/bug/20190623/1268307.html