LINUX.ORG.RU

Ошибки и исключения в Python - не понимаю разницы!

 , , ,


0

2

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

Т.е. допустим у меня были ошибки синтаксиса, когда неправильно скобки или пробелы расставлял. Или были ошибки имен, когда использовал переменную, которой ничего не присвоено. Или приводится еще такой пример, когда закончилась память, будет ошибка нехватки памяти и аварийное завершение программы. Считается, что это именно фатальные ошибки, и ничего с этим не поделать, поэтому нельзя называть их исключениями.

С другой стороны - исключения. Ситуации, которые можно обработать. Например, программа завершилась из-за того, что в какой-то части происходит деление на 0. Эту ситуацию можно предугадать и обработать ввод пользователя, так чтобы ему выдавалось предупреждение изнутри программы, а не ошибка интерпретатора, и сделать так чтобы программа не завершалась, поэтому это называется исключением.

Но что-то я никак не пойму, существует ли в оригинале эта разница или нет? Или это кривые переводы русских руководств? Если существует, хочу увидеть полный список «просто ошибок» и исключений в официальном гайде.

А пока что вижу кучу разных мнений. Например, здесь почему-то выделяют отдельно только синтаксические ошибки, а все что не является синтаксической ошибкой - это типа исключения.

https://www.tutorialsteacher.com/python/error-types-in-python

Причем пишут, что во многих случаях ошибка может вылезти уже после запуска программы, и тогда это считается исключением. Но опять же, почему? В любой момент может кончиться память, допустим. И тогда программа вылетит - тоже после запуска. Это что теперь - тоже исключение? Ты же не можешь с этим ничего сделать, если в системе кончилась память. Какая-то путаница…

Или другая ссылка, кажется более официальная - «встроенные исключения». И здесь как я понял вообще ВСЕ ОШИБКИ называются исключениями. Перед названием каждой ошибки стоит слово «exception», например, exception SyntaxError. Да тут кругом один сплошной exception.

https://docs.python.org/3/library/exceptions.html

Так кто прав? В питоне все ошибки это исключения, или не все? Где прочитать про разницу и увидеть полный список того и другого?


Это условное разделение, по устройству никак не отличаются. Смысл в том, что ошибки воспринимаются как баги, как нарушение инвариантов они никогда не должны возникать, поэтому их и не нужно обрабатывать, а исключение - это не обязательно баг, это может быть ошибка бизнес логики, например это может быть UserNotFoundException, программа может словить это исключение и отобразить пользователю красивое сообщение, либо как-то еще обработать его.

Int64 ★★★
()

Питонячего кода - да. Но всякие сишные либы и сам питон могут выкинуть segmentation fault который не обработать :)

KillTheCat ★★★★★
()
Ответ на: комментарий от Int64

У меня вот от подобных гайдов только каша в голове возникает.

https://pep8.ru/doc/tutorial-3.1/8.html

https://pythonru.com/osnovy/znachenija-iskljuchenij-i-oshibok-v-python

Сразу проводится какая-то разграничительная линия - есть простые ошибки, а есть исключения. Это можно обработать, а это нельзя… Почему-то синтаксические ошибки и ошибки нехватки памяти ставят в один ряд как не-исключения, а я бы тут поспорил - если внезапную нехватку памяти спрогнозировать сложно, то в чем проблема внимательно посмотреть код и не косячить с лишними символами? Это же в твоих руках. Это странное разграничение на исключения и не-исключения только мешает понять.

Вот в официальном руководстве я даже не смог найти главу вроде «Common Errors», там статья об ошибках в питоне называется «Built-in Exceptions», и туда поместили вообще все ошибки, включая синтаксические.

https://docs.python.org/3/library/exceptions.html

Но тогда почему в русских гайдах пишут какую-то фигню?

Смысл в том, что ошибки воспринимаются как баги

а исключение - это не обязательно баг, это может быть ошибка бизнес логики

Так что тогда перечислено в официальном гайде? Как это воспринимать? Часть ошибок из того списка по идее можно обработать, а часть нет… Они таки ВСЕ являются исключением на языке ОФИЦИАЛЬНОГО питона, или нет? Не хочу быть неграмотным.

utrack
() автор топика
Ответ на: комментарий от KillTheCat

Питонячего кода - да. Но всякие сишные либы и сам питон могут выкинуть segmentation fault который не обработать :)

Т.е. все что находится в этом списке - абсолютно все - надо называть исключениями?

https://docs.python.org/3/library/exceptions.html

Например, тут нет в списке ошибки сегментации. Ее в случае возникновения должен выдать интерпретатор питона? Или операционная система?

utrack
() автор топика
Ответ на: комментарий от utrack

Они таки ВСЕ являются исключением на языке ОФИЦИАЛЬНОГО питона, или нет?

Вот, например, ты пограммой читаешь файл, а файла нет, вылетело исключение. Или пишешь в файл — а место закончилось, вылетело исключение. Это штатное поведение или недоработка? В зависимости от контекста.

Например, тут нет в списке ошибки сегментации

Segfault это однозный косяк.

thunar ★★★★★
()
Последнее исправление: thunar (всего исправлений: 1)
Ответ на: комментарий от thunar

Вот, например, ты пограммой читаешь файл, а файла нет, вылетело исключение. Или пишешь в файл — а место закончилось, вылетело исключение. Это штатное поведение или недоработка? В зависимости от контекста.

Наверно все-таки штатное. Раз уж ты сам добавил функцию работы с файлами, то потрудись обработать все возможные ситуации. Например, можно проверить наличие свободного места в системе перед записью. Но думаю это в любом случае исключения - оба. Так же и в официальном гайде нехватка памяти считается исключением. Вернее, там вообще все питоновские ошибки считаются исключением.

В связи с чем возникает предположение, что все ошибки в питоне называются исключениями… А другие виды ошибок - это не питоновские, а какие-то системные ошибки, к самому языку не имеющие отношения.

Segfault это однозный результат недопроверки.

Судя по вики, эта ошибка чаще всего возникает в программах на С, но тоже по сути не является частью языка С, т.к. сигнал SIGSEGV отправляет сама система, это не сообщение компилятора… Думаю, если в питоне есть Segfault, то сообщение об ошибке Segfault тоже будет отправлять система, а не интерпретатор. Я такой ошибки даже в списке не увидел.

https://docs.python.org/3/library/exceptions.html

utrack
() автор топика

А вот этот гайд я смотрю вообще устарел.

https://www.tutorialsteacher.com/python/error-types-in-python

Многое из того что в питоне раньше называлось «ошибкой», в новой версии судя по всему превратилось в варнинг. Это как понимать? Из-за варнинга программа не завершается аварийно?

https://docs.python.org/3/library/exceptions.html

utrack
() автор топика
Ответ на: комментарий от KillTheCat

могут выкинуть segmentation fault который не обработать :)

SIGSEGV же можно словить. Вроде и в самом питоне тоже. Толкового сделать можно не так уж и много, но это уже другое.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

каллбаки на сигналы в питоне тоже вешаются конечно.

В сях мы обычно по такому поводу выводим стек в логи… ну и все, да.

AntonI ★★★★★
()
Ответ на: комментарий от utrack

Например, тут нет в списке ошибки сегментации. Ее в случае возникновения должен выдать интерпретатор питона? Или операционная система?

По этому поводу система кидает сигнал. Этот сигнал можно обработать перед завершение программы, но собственно если SIGSEGV прилетел то это уже все - а что тут сделаешь? Все пошло настолько не так что можно только завершить работу. Ну в логи написать можно что вот, беда такая…

AntonI ★★★★★
()
Ответ на: комментарий от Morin

Отвечает Александр Друзь.

Произвольное число на ноль делить нельзя, так как все умноженное на ноль даст ноль, что может быть не равно делимому. Если имеются в виду неопределенности вида 0/0, то их надо раскрывать с помощью теорем о замечательных пределах.

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Эммм… правило Лопиталя помню, замечательные пределы знаю, про ТЕОРЕМУ о замечательных пределах кажетяс раньше не слыхал.

Возможно это какой то неправильный Александр Друзь и он дает неправильный мед ответы?;-)

тыц

AntonI ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

я знал, что наброс взлетит :)

anonymous
()

Исключение - это ошибка, возникшая вне основного контекста выполнения. Например. У тебя проект: ты лепишь куличик из песка, у тебя есть функции набрать_песка_в_ведерко, утрамбовать_песок_, высыпать_песок. Ты умеешь обрабатывать типовые ошибки этих функций: сломалось ведерко, погнулся совочек, кончился песочек. Этого вроде достаточно, но тут под песочницей прорывает трубу с говном. Это - исключительная ситуация, которую ловит обработчик исключений, а не основной цикл с тремя функциями. Ты обрабатываешь исключение: с ревом убегаешь к маме утираться и больше не лезешь в программирование, пока не научишься в простейшие абстракции.

anonymous
()

Где прочитать про разницу

Ну вообще ответ довольно прост: Не используй except Exception: и except:, обрабатывай только то, что ожидаешь. Тогда «полный список» тебе не понадобится.

Aswed ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.