2016-03-18 7 views
19

Я использую стороннюю библиотеку, которая прекрасна, но не обрабатывает неубедительные файлы так, как мне хотелось бы. Когда придав ему несуществующий файл, вместо того, чтобы поднять старый добрыйКак правильно создать файл FileNotFoundError?

FileNotFoundError: [Errno 2] No such file or directory: 'nothing.txt' 

это вызывает какое-то непонятное сообщение:

OSError: Syntax error in file None (line 1) 

Я не хочу, чтобы обрабатывать отсутствующий файл, не хотим улавливать или обрабатывать исключение, не хотят создавать настраиваемое исключение, ни хочу, чтобы я был open файла, или не создавал его, если он не существует.

Я только хочу проверить его существует (os.path.isfile(filename) будет делать трюк), а если нет, то просто поднимите правильный FileNotFoundError.

Я попытался это:

#!/usr/bin/env python3 

import os 

if not os.path.isfile("nothing.txt"): 
    raise FileNotFoundError 

какие только выходы:

Traceback (most recent call last): 
    File "./test_script.py", line 6, in <module> 
    raise FileNotFoundError 
FileNotFoundError 

Это лучше, чем «Синтаксическая ошибка в файле None», но как можно поднять «реальный» исключение python с правильным сообщением, без необходимости его переопределения?

ответ

33

Pass в качестве аргументов:

import errno 
import os 

raise FileNotFoundError(
    errno.ENOENT, os.strerror(errno.ENOENT), filename) 

FileNotFoundError подкласс OSError, который принимает несколько аргументов. Первый - это код ошибки из errno module (файл не найден всегда errno.ENOENT), второй - сообщение об ошибке (используйте для этого os.strerror()) и передайте имя файла как третье.

Окончательное представление строки, используемое в TRACEBACK построено из этих аргументов:

>>> print(FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), 'foobar')) 
[Errno 2] No such file or directory: 'foobar' 
+0

Отлично! Я так старался найти правильный способ написать это. – zezollo

+0

@zezollo: Я обновил ответ; Я нашел 'os.strerror()' now (я * знал *, было где-то сопоставление от номера ошибки до строкового сообщения). –

Смежные вопросы