2012-01-23 22 views
17

我试图实现一种只在某个目录不存在时才返回错误的方法。在python中使用默认消息提高内建异常

但是,我不想使用raise OSError("Directory does not exist."),而是使用OSError中的builtint错误消息:OSError: [Errno 2] No such file or directory:。这是因为我在方法调用的开始时引发异常,而不是稍后(它会从python调用相同的消息,而没有任何必要的raise)。

任何指针? (其他比手动操作的方式OSError("[Errno 2] No such file or directory: ")

+2

触发异常,让它传播? – delnan

+0

为什么你不想在你的方法调用开始时自己抛出异常,例如'引发OSError(...)'?这是告诉您的来电者有问题的完美方式。 –

+0

正是我想要做的〜我只是在寻找一种方法来访问内置的错误消息。 – bow

回答

22
import os 

try: 
    open('foo') 
except IOError as err: 
    print(err) 
    print(err.args) 
    print(err.filename)  

产生

[Errno 2] No such file or directory: 'foo' 
(2, 'No such file or directory') 
foo 

所以,以产生具有类似的消息使用

raise OSError(2, 'No such file or directory', 'foo') 
+2

+1不知道! – juliomalegria

+3

使用'errno'模块和'os.strerror'中的错误名称将它们转换为本地化的消息字符串优于硬编码值:'OSError(errno.ENOENT,os.strerror(errno.ENOENT),filename )' – user3426575

+0

使用** e.errno,e.filename和e.strerror **获取有关异常的信息。注意它看起来像这些都是无(包括errno),除非至少有两个参数指定为例外,其中filename是第三个参数。 –

-1
try: 
    # ... 
except OSError: 
    raise OSError("your answer") 
+0

对不起,这样的观点,我发布的答案从Android和它没有正常的代码编辑 – pod2metra

9

一个OSError要获得一个错误消息给定错误代码,您可能需要使用os.strerror

>>> os.strerror(2) 
'No such file or directory' 

此外,您可能需要使用errno模块使用标准缩写为那些错误:

>>> errno.ENOENT 
2 
>>> os.strerror(errno.ENOENT) 
'No such file or directory' 
+0

哇,我不知道这个。这将是有用的:)。谢谢! – bow

1

我觉得这里真正的问题是,你可能做了一堆检查,事先而不是尝试一下。

try: 
    [CODE] 
except Exception: 
    [HANDLING CODE] 

比要好得多:

if [SPECIAL CASE]: 
    [HANDLING CODE] 
elif [special case]: 
    [SPECIAL CASE] 
[CODE] 
2

我认为“异常”是Python语言的术语,你在呼唤“错误”。因此,在您搜索更多信息时使用此术语。

您可能会发现阅读Python Standard Library documentation, "6. Built-in Exceptions"是有用的。

OSError是内置的例外之一。它在“内置例外”一节中定义,其中添加了“errno属性是来自errno的数字错误代码,并且strerror属性是相应的字符串,将由C函数perror()打印。请参阅模块errno ,其中包含由底层操作系统定义的错误代码的名称。“

运行这段代码:

raise OSError(42, "my exception string", "no_such_file.dat") 

给了我这样的结果:

Traceback (most recent call last): 
    Line 1, in <module> 
    raise OSError(42, "my exception string", "no_such_file.dat") 
OSError: [Errno 42] my exception string: 'no_such_file.dat' 

所以,我觉得你的代码可以这样做:

raise OSError(2, "No such file or directory", filename)