Как игнорировать все потенциальные исключения в Python?

Я пишу собственный скрипт резервного копирования на Python. Иногда функция mkdir, функция печати или любая другая функция не работают по разным причинам. Такие исключения останавливают весь сценарий и останавливают резервное копирование в середине, что очень расстраивает. До сих пор я справлялся с этими проблемами, добавляя операторы try: ... кроме:... и правильно обрабатывая эти исключения. Однако однажды другой оператор или функция может также вызвать исключение по какой-то другой причине, которая еще не сработала.

Есть ли способ сказать сценарию, чтобы продолжить в любом случае? Эквивалент обертывания каждого отдельного утверждения кода в предложении try: ... кроме: pass? Журнал был бы лучше, конечно.

Я заметил, что при программировании с помощью инструментария GUI, такого как Tkinter, приложение продолжает работать, даже если возникают исключения. Можно ли выполнить этот тип вещи с помощью консоли?

7 ответов

Решение

Python не может этого сделать, и на то есть веские причины.

Кажется, вы не понимаете, что значит писать "надежное" программное обеспечение: надежная программа - это не программа, которую трудно убить и которая будет продолжать работать, несмотря ни на что, а программа, которая будет правильно обрабатывать крайние случаи. Продолжать бегать недостаточно. Ключевой момент - продолжать делать разумные вещи.

К сожалению, нет способа делать разумные вещи автоматически, и вы должны думать в каждом конкретном случае, как справиться с ошибкой.

Помните, что если в программе много catch это редко хорошая программа. Исключения должны возникать во многих местах и ​​встречаться почти нигде.

Обратите внимание, что каждый catch потенциально является источником ошибок... например:

try:
    print my_dict[foo()]
except KeyError:
    ...

не может отличить, если KeyError приходит для доступа к несуществующему ключу в my_dict или если вместо этого сбежал из foo(), Редко два случая должны рассматриваться одинаково...

Лучше написать:

key = foo()
if key in my_dict:
    print my_dict[key]
else:
    ...

так что только боковой корпус отсутствует ключ в my_dict обрабатывается и вместо KeyError Исключение остановит программу (единственная разумная вещь, которую нужно сделать - это остановить программу, если вы не уверены в том, что она делает).

На самом деле есть модуль, который должен делать именно это: https://github.com/ajalt/fuckitpy.

Хотя это явно было написано как шутка. Я не могу представить ситуацию, когда делать что-то подобное - хорошая идея. Боже, я не могу поверить, что я даже предлагаю это как решение.

Вместо этого вам следует определить, какие строки кода могут вызвать ошибки, и правильно их обработать. Есть только так много мест, где ошибки могут действительно происходить - в основном при взаимодействии с внешними системами, включая файловую систему, сеть, ввод данных пользователем и т. Д. И помните, что на самом деле сбой часто лучше, чем продолжать "работать" и портить ваши данные, файлы и т. Д. на. Исключения существуют по какой-то причине, они не являются результатом злого умысла Гвидо.

Python имеет BaseException в качестве базового класса для классов исключения. Вы можете поймать и игнорировать базовый класс Exception, который охватит все исключения.

try
    ... your code here ...
except BaseException as exp:
    print "A General Exception Occurred"
try:
   # code segment
except:
   pass

ключевое словоpass игнорирует все исключения

Новый ответ для нового поколения ...

Python теперь поставляется с suppress(), это говорит интерпретатору подавлять указанные исключения во время работы.

Может быть легко импортирован, как показано ниже

      from contextlib import suppress
with suppress(ValueError):
    int('this wont catch')
print('yea')

Вышеупомянутое будет работать, не вызовет исключение ValueError для изменения недопустимой строки int на int ...

Это более чисто, чем сторонние библиотеки.

Удачного взлома

Обычно этот должен поймать все:

try:
   ....
except:
   pass

Единственная проблема в том, что вы не получите объект исключения с этим синтаксисом, но в этом случае это не запрашивалось.

Вы можете добавить общий блок, кроме предложенного @Kanwar Saad. Вопрос в том, можете ли вы продолжить свою программу в допустимом состоянии после возникновения исключения?

Из дзен питона:

Errors should never pass silently.
Unless explicitly silenced.

Попытка поймать все исключения, которые вы знаете, по моему мнению, является лучшим способом. Если вы не можете явно перехватить исключение, вы не должны пытаться обходить его. Вы (и ваши пользователи) должны знать, что именно пошло не так, иначе ваш код может стать кошмаром для отладки.

Если вы беспокоитесь о потере данных резервного копирования, возможно, вы могли бы сделать что-то вроде этого:

def save_unfinished_backup():
    # try to find a graceful exit without losing any data

try:
    # some code
except OSError:
    # handle oS Errors
except Exception:
    save_unfinished_backup()
    raise

Таким образом, вы получаете и шанс на потерю данных, и точную ошибку для их отладки.

Надеюсь, это поможет!


На забавное замечание: вы также можете использовать модуль fuckit. Что заставляет замолчать ВСЕ ошибки, в том числе синтаксические ошибки. Но никогда не используйте это в продуктивном коде.

Это должно работать отлично. Это не будет печатать "фу", но вы достигнете print("bar") без сбоев.

import fuckit

with fuckit:
    prnt("foo")

print("bar")
Другие вопросы по тегам