Эффективный метод обработки ошибок в функции - PullRequest
1 голос
/ 23 января 2020

Пример функции обработки ошибок:

def read_file():
    try:
        with open(filename, 'rb') as fd:
            x = fd.read()
    except FileNotFoundError as e:
        return(e)
    return(x)

Я бы назвал эту функцию следующим образом:

file = read_file("test.txt")
if file:
    #do something

есть более эффективный / эффективный способ обработки ошибок, чем многократное использование возврата

1 Ответ

1 голос
/ 23 января 2020

Очень странно поймать e и затем вернуть его; почему пользователь вашей функции хочет, чтобы ошибка возвращалась, а не возникала? Возврат ошибки не обрабатывает ее, он просто передает вызывающей стороне ответственность за обработку ошибки. Разрешение возникновения ошибки - более естественный способ сделать так, чтобы вызывающая сторона отвечала за ее обработку. Поэтому имеет смысл вообще не отлавливать ошибку:

def read_file(filename):
    with open(filename, 'rb') as fd:
        return fd.read()

Для желаемого варианта использования, когда вы хотите написать if file:, чтобы проверить, существует ли файл, ваша read_file функция может перехватить error и return None, так что ваше if условие будет ложным:

def read_file(filename):
    try:
        with open(filename, 'rb') as fd:
            return fd.read()
    except FileNotFoundError:
        return None

Однако это означает, что если вызывающий не знает, что функция может вернуть None, вы ' Вы получите ошибку при использовании None там, где ожидались данные файла, вместо FileNotFoundError, и вам будет сложнее определить проблему в вашем коде.

Если вы намерены выполнить свою функцию для Чтобы вызвать его с именем файла, которое может не существовать, присвоение этой функции имени, подобного read_file_if_exists, может быть лучшим способом прояснить, что вызов этой функции с несуществующим именем файла не считается ошибкой.

...