在Python中使用内置str()类型的潜在异常

Ale*_*lec 5 python string exception-handling built-in python-3.x

在Python intfloatPython中使用内置类型时,通常在输入可能不可靠的情况下采用异常处理:

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
Run Code Online (Sandbox Code Playgroud)

使用时是否需要注意任何突出的边缘情况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!'
Run Code Online (Sandbox Code Playgroud)

我真的不喜欢使用广泛,Exception因为在某些情况下NameError,这表示代码有问题,并会引发错误。我认为UnicodeError作为一个候选人,但我不知道是否str()导致它(与foo.encode()foo.decode()它更容易理解),他会喜欢什么样的输入,如果有的话,将触发它的例子。

总结:即使输入不可靠,在str()没有try/ except块的情况下使用它也通常安全吗?

mgi*_*son 2

在这方面, str和之间存在巨大差异。绝对可以提高和。intintTypeErrorValueError

据我所知,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)
Run Code Online (Sandbox Code Playgroud)

而这只发生在 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
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,我会质疑一些隐含的假设,即此时需要处理所有异常。一般来说,最好只处理您知道如何处理的异常。在这种情况下,由于用户将垃圾放入函数而发生的异常异常可能应该在垃圾进入的级别进行处理,而不是在函数本身内进行处理。捕获错误并返回一些可能是无意义的值对于调试问题等不会有太大帮助。