str能否引发异常?

4
< p > 是否有可能 str非可调用参数引发异常?除了某些原因可能覆盖__repr__的自定义类之外?

我有一些参数在函数进入时,如果不是str,就会将其转换为str。我想知道是否必须处理异常,如果必须处理,应该处理哪些异常?处理Exception并不是一个好的实践,但似乎这是唯一的方法。

编辑: 所谓的非可调用意味着参数没有在str内执行,例如str(get_something_to_convert())。在这个例子中,我应该在内部函数中处理异常。


“get_something_to_convert()” 是你真正的函数吗?还是 “get_something_to_convert” 是一个变量,它可以是一个函数或其他东西?我没有完全理解你的问题。 - Anand S Kumar
即使是可调用参数,如果您实际上没有调用它们,那么从str(something)中获得错误的唯一方法是,如果something.__str__()(或.__repr __())引发异常,这会有点不寻常。 - jonrsharpe
@jonrsharpe,这是可能的。str并没有做任何特殊处理来吞噬它们。 - Peter Wood
1
@PeterWood 不,那是真的;它不会悄悄地抑制任何发生的错误。 - jonrsharpe
@AnandSKumar 这只是一个例子,我不调用传递的参数,而是按原样进行转换。 - Dawid Gosławski
1个回答

5
任何类都可以为任何原因覆盖__str__,因为如果同时定义了__str____repr__str将调用__str__。依我之见,这已足够理由准备好处理异常。
但对于非英语用户来说,Python 2.x 中的 Unicode 字符串是一个常见的陷阱。只需看一下以下代码:
>>> a = u'\xe9\xe8'
>>> print a
éè
>>> str(a)

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    str(a)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1:
 ordinal not in range(128)

当您在其上调用str时,包含非ASCII字符的简单Unicode字符串将引发异常。

您可以选择处理异常或记录该函数仅接受可以直接使用str转换为字符串的参数。


哦,好的。编码是可能出现的问题之一,我认为这可能是唯一的问题。我也无法想象其他的例子,用户可以将任何对象作为参数传递,但我想我会简单地记录它并处理编码错误 :) 非常感谢。 - Dawid Gosławski
默认情况下,我相信 __str__ 委托给 __repr__。这个规则的主要例外是字符串类型和 Python 2.x 中的浮点数。例如,str([]) == repr([]),但 str("") != repr("") - Dunes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接