Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MemoryError';在Python中,作为str的消息为空_Python_Exception_Exception Handling_Out Of Memory - Fatal编程技术网

MemoryError';在Python中,作为str的消息为空

MemoryError';在Python中,作为str的消息为空,python,exception,exception-handling,out-of-memory,Python,Exception,Exception Handling,Out Of Memory,这是一个非常愚蠢的问题,但我正在运行一些任务,并通过以下方式捕捉它们的错误: try: run_something() except Exception as e: handle_error(str(e)) 我希望错误消息为字符串,因为我使用的是UI,我希望在窗口中显示错误 该问题可以复制为: >>> import numpy as np >>> np.range(1e10) MemoryError

这是一个非常愚蠢的问题,但我正在运行一些任务,并通过以下方式捕捉它们的错误:

try:
    run_something()
except Exception as e:
    handle_error(str(e))
我希望错误消息为字符串,因为我使用的是UI,我希望在窗口中显示错误

该问题可以复制为:

>>> import numpy as np
>>> np.range(1e10)
MemoryError                               Traceback (most recent call last)
<ipython-input-4-20a59c2069b2> in <module>() 
----> 1 np.arange(1e10)

MemoryError: 
我得到的唯一输出是“捕获!”。这太愚蠢了,我在做一些UI和线程方面的工作,花了一段时间才意识到问题是一个没有任何消息的内存错误


MemoryError是唯一转换为空字符串的异常吗?因为如果是这样的话,我可以检查一下。如果不是,如何以字符串形式获取其消息?

因此,您可能需要打印异常类的名称:

使用
str(e)
仅打印异常的“消息”,在您的情况下,该消息为空


请注意,您可以通过
args
属性获取传递给异常构造函数的参数:

In [4]: try:
   ...:     raise ValueError(1,2,3)
   ...: except ValueError as e:
   ...:     print('arguments:', e.args)
arguments: (1, 2, 3)

从Python文档(2.7版,我想也适用于Python3.x)中可以看出:

所有内置异常的基类。它并不意味着由用户定义的类直接继承(为此,请使用Exception)。如果对此类的实例调用str()或unicode(),则将返回实例的参数表示形式,或者在没有参数时返回空字符串

MemoryError似乎没有参数,因此根据本文档,它确实返回了一个空字符串

当然,异常仍然可以被捕获,因为它可以通过其类型被捕获

您可以获取异常类的名称并打印它

这当然也很有意义,因为你看:

a = {}
try:
    a['barrel']
except Exception as e:
    print str(e)
将只打印“barrel”——这没有多大帮助,因此添加异常的类名确实是一个好主意:

...
except Exception as e:
    print(e.__class__.__name + ': ' + (str(e)))
当调用
str(e)
时,它返回异常消息。举个例子-

NameError: name 'a' is not defined
^          ^
name       message
MemoryError:
前面的部分是异常的名称,而后面的部分是消息(参数)

MemoryError
的情况下,正如您在示例中看到的那样-

NameError: name 'a' is not defined
^          ^
name       message
MemoryError:
没有错误消息,只有异常的名称,因此得到空字符串

我不确定是否还有其他例外情况没有例外,但我相信很少会发现这样的例外情况。如果您真的想处理MemoryError(可能还有其他没有消息的罕见异常),您可以打印异常的名称和消息,比如-

print(type(e).__name__ , ':', str(e))