- Что такое исключения в программировании
- Что такое обработчик ошибок
- Пример программы без обработчика исключений
- Программа с обработчиком исключений
- Когда что-то не предусмотрено — будет ошибка
- Получается, всё нужно делать с обработкой исключений?
- Обработка и создание исключений в .NET
- Исключения
- Исключения и традиционные методы обработки ошибок
- Часто встречающиеся исключения
- См. также
Что такое исключения в программировании
Рассказ об ошибках, которые можно предусмотреть заранее.
Большинство наших проектов устроены так: когда во время работы программы возникает какая-то ошибка, то программа аварийно завершается. Иногда при этом она выдаёт сообщение об ошибке. Кажется, что это нормальная ситуация, но на самом деле большинство ошибок можно предусмотреть и научить программу правильно с ними работать. Для этого нам нужны обработчики ошибок.
Что такое обработчик ошибок
Чтобы программа знала, что делать, если возникла какая-то ошибка, используют обработчики исключительных ситуаций, или, проще говоря, обработчики исключений. Смысл такой:
- Мы заранее прикидываем, в каком месте и почему может возникнуть ошибка.
- Пишем в этом месте специальный код, который предупредит компьютер, что это плановая ошибка и что у нас уже есть решение, мол, всё под контролем.
- Компьютер применяет наше решение и переходит к следующей команде.
- Программа не падает, не завершается с ошибкой, а продолжает работать.
Такие обработчики есть не в каждом языке программирования, но большинство современных языков это умеют делать.
Пример программы без обработчика исключений
Допустим, у нас в программе на Python предусмотрено чтение данных из файла и есть такой код:
Но если на диске этого файла не будет, то компьютер, когда дойдёт до этой строчки, выдаст ошибку:
Давайте нарисуем это в виде простой схемы:
Получается, что наша задача — предусмотреть вариант, что на диске не будет нужного файла, и придумать поведение программы в этом случае. Используем для этого обработчик исключений.
Программа с обработчиком исключений
Если мы знаем, что в каком-то месте возможна ошибка, то можем тогда предусмотреть этот сценарий и подстраховаться. Для этого используют обработчик и делают так:
- В том месте, где можно предусмотреть ошибку, делают специальный блок.
- В этом блоке запускают команду и смотрят, будет ошибка или нет.
- Если ошибки нет — программа работает дальше.
- Если возникла ошибка — выполнятся то, что написано в обработчике ошибок, а потом программа работает дальше.
В этой ситуации программа не зависнет и не вывалится с ошибкой, а сама сможет её обработать и делать дальше то, что нужно:
try: file = open("myfile2.txt") except FileNotFoundError: print("Файл не найден, создаю новый") file = open("myfile2.txt","a")
Команда try — это начало нашего обработчика исключений. Она говорит компьютеру: «Попробуй выполнить вот эту команду, а мы посмотрим, что произойдёт».
Except — это какую ошибку мы ожидаем здесь увидеть. В нашем случае мы хотим предусмотреть случай, что такого файла нет, поэтому пишем стандартную ошибку для такой ситуации.
👉 Сравните текст этой ошибки с тем, что нам выдал компьютер в предыдущем разделе.
В других языках конструкция обработчика исключений может выглядеть по-другому, но смысл тот же: говорим компьютеру, какую команду нужно выполнить и что делать, если появилась конкретная ошибка.
Когда что-то не предусмотрено — будет ошибка
Если программе в этом блоке встретится другая ошибка, не та, которую мы предусмотрели, то программа остановится и всё перестанет работать. Например, вот какие ошибки могут возникнуть с файлом:
- файл есть на диске, но к нему нет прав доступа;
- файл занят другой программой;
- сам диск повреждён и данные не читаются.
Во всех этих случаях программа сломается, потому что мы не предусмотрели эти ситуации:
Получается, всё нужно делать с обработкой исключений?
- Обработка исключений занимает лишнее время, поэтому программа с ними работает медленнее, чем без них.
- Не всё можно предусмотреть. Если разработчик не знает, что здесь может быть ошибка, то и предусмотреть он это тоже не сможет.
- Конструкции с обработчиками делают код менее читаемым и понятным для человека. Ему нужно будет держать в голове точку начала обработки, понять, как обработка влияет на программу в целом, и выяснить, что будет с программой после работы обработчика ошибок.
Конечно, есть места в коде, которые лучше делать с обработкой ошибок: работа с файлами, сетевые запросы или получение внешних данных. Но запихивать исключения на каждую команду в программе точно не стоит.
Обработка и создание исключений в .NET
Необходимо реализовать возможность единообразной обработки приложениями ошибок, происходящих во время выполнения. Среда .NET предоставляет модель для единообразного уведомления приложений об ошибках: операции .NET информируют о сбое посредством выдачи исключений.
Исключения
Исключение — это любое состояние ошибки или непредвиденное поведение, возникающее при выполнении программы. Исключения могут возникать из-за сбоя в вашем или вызываемом коде (например, в общей библиотеке), недоступности ресурсов ОС, неожиданных состояний, возникающих в среде выполнения (например, код, который невозможно проверить) и по другим причинам. После некоторых из этих состояний приложение может восстановиться, после других — нет. В большинстве случаев вы можете выполнить восстановление после большинства исключений в приложении, но не после исключений среды выполнения.
В .NET исключение — это объект, наследуемый от класса System.Exception. Исключение создается из области кода, где произошла проблема. Исключение передается вверх по стеку до тех пор, пока его не обработает приложение либо программа не завершится.
Исключения и традиционные методы обработки ошибок
Традиционно модели обработки ошибок разных языков программирования основываются либо на уникальном для языка способе обнаружения ошибок и отыскании для них обработчиков, либо на механизме обработки ошибок, предоставляемом операционной системой. Способ обработки исключений, реализуемый в .NET, обладает следующими преимуществами:
- Создание и обработка исключений работают одинаково для языков программирования .NET.
- Не требует определенного синтаксиса языка для обработки исключений, а позволяет каждому языку определить собственный синтаксис.
- Исключения можно создавать между разными процессами и даже компьютерами.
- В приложение можно добавить код обработки исключений для повышения надежности программы.
Исключения обеспечивают ряд преимуществ по сравнению с другими методами уведомления об ошибках, например кодами возврата. Сбои не остаются незамеченными, так как среда выполнения завершает работу приложения при наличии необработанного исключения. Недопустимые значения не распространяются по системе из-за того, что код не способен выполнить проверку кода возврата ошибки.
Часто встречающиеся исключения
В следующей таблице перечислены некоторые общие исключения с примерами возможных причин.
Тип исключения | Описание | Пример |
---|---|---|
Exception | Базовый класс для всех исключений. | Отсутствует (используйте производный класс этого исключения). |
IndexOutOfRangeException | Вызывается средой выполнения только при неправильной индексации массива. | Индексирование массива вне допустимого диапазона: arr[arr.Length+1] |
NullReferenceException | Вызывается средой выполнения только в том случае, если имеется ссылка на пустой объект. | object o = null; o.ToString(); |
InvalidOperationException | Вызывается методами в недопустимом состоянии. | Вызов Enumerator.MoveNext() после удаления элемента из базовой коллекции. |
ArgumentException | Базовый класс для всех исключений аргументов. | Отсутствует (используйте производный класс этого исключения). |
ArgumentNullException | Вызывается методами, которые не допускают пустой аргумент. | String s = null; «Calculate».IndexOf(s); |
ArgumentOutOfRangeException | Вызывается методами, проверяющими попадание аргументов в заданный диапазон. | String s = «string»; s.Substring(s.Length+1); |
См. также
- Класс Exception и его свойства
- Практическое руководство. Использование блока try/catch для перехвата исключений
- Практическое руководство. Использование определенных исключений в блоке catch
- Практическое руководство. Явное создание исключений
- Практическое руководство. Создание пользовательских исключений
- Использование обработчиков исключений с пользовательской фильтрацией
- Практическое руководство. Использование блоков Finally
- Обработка исключений COM-взаимодействия
- Рекомендации по обработке исключений
- What Every Dev needs to Know About Exceptions in the Runtime (Что нужно знать всем разработчикам об исключениях в среде выполнения).