Вот интересный факт: нет код не содержит ошибок - фактически, некоторый код полон «ошибок» специально.
Что за ошибка в приложении? Ошибка - это неправильно закодированное решение проблемы. Такие логические ошибки это может привести к неправильным результатам функции, когда все выглядит хорошо, но результат приложения совершенно непригоден. С логическими ошибками, применение может или не может перестать работать.
Исключения могут включать ошибки в вашем коде, когда вы пытаетесь разделить числа на ноль, или вы пытаетесь использовать освобожденные блоки памяти или пытаетесь предоставить неправильные параметры функции. Однако исключение в приложении не всегда является ошибкой.
Исключения и класс исключений
Исключением являются особые условия, которые требуют особого обращения. Когда возникает условие типа ошибки, программа вызывает исключение.
Вы (как разработчик приложения) будете обрабатывать исключения, чтобы сделать ваше приложение более подверженным ошибкам и реагировать на исключительные условия.
В большинстве случаев вы обнаружите, что являетесь автором приложения, а также автором библиотеки. Поэтому вам нужно знать, как вызывать исключения (из вашей библиотеки) и как их обрабатывать (из вашего приложения).
Статья о обработка ошибок и исключений предоставляет некоторые основные рекомендации о том, как защититься от ошибок, используя блоки try / instance / end и try / finally / end для защиты или обработки исключительных условий.
Простая попытка / исключение защитных блоков выглядит так:
пытаться
ThisFunctionMightRaiseAnException ();
Кроме// обрабатывать любые исключения, возникшие в ThisFunctionMightRaiseAnException () здесь
конец;
Исключение ThisFunctionMightRaiseAnException может иметь в своей реализации строку кода, подобную
повышение Исключение. Создать («особое условие!»);
Исключением является специальный класс (один из немногих без Т перед именем), определенный в модуле sysutils.pas. Модуль SysUtils определяет несколько потомков исключений специального назначения (и, таким образом, создает иерархия классов исключений) как ERangeError, EDivByZero, EIntOverflow и т. д.
В большинстве случаев исключения, которые вы обрабатываете в защищенном блоке try / исключением, не относятся к исключению (базовый) класс, но некоторого специального класса-потомка Exception, определенного либо в VCL, либо в библиотеке, в которой вы находитесь с помощью.
Обработка исключений с помощью Try / Except
Чтобы поймать и обработать тип исключения, вы должны создать обработчик исключения «on type_of_exception do». «На исключение делать» очень похоже на классическое утверждение case:
пытаться
ThisFunctionMightRaiseAnException;
excepton EZeroDivide dobegin// что-то при делении на нольконец;
на EIntOverflow dobegin// что-то при слишком большом целочисленном вычисленииконец;
elsebegin// что-то, когда возникают другие типы исключенийконец;
конец;
Обратите внимание, что часть else будет захватывать все (другие) исключения, включая те, о которых вы ничего не знаете. В целом, ваш код должен обрабатывать только те исключения, которые вы действительно знаете, как обрабатывать, и ожидаете, что их выбросят
Кроме того, вы никогда не должны «есть» исключение:
пытаться
ThisFunctionMightRaiseAnException;
Кроме
конец;
Использование исключения означает, что вы не знаете, как обрабатывать исключение, или вы не хотите, чтобы пользователи видели исключение или что-то среднее.
Когда вы обрабатываете исключение, и вам нужно больше данных из него (в конце концов, это экземпляр класса), а не только тип исключения, которое вы можете сделать:
пытаться
ThisFunctionMightRaiseAnException;
excepton E: исключение dobegin
ShowMessage (E.Message);
конец;
конец;
«E» в «E: Exception» - это временная переменная исключения типа, указанного после символа столбца (в приведенном выше примере базовый класс Exception). Используя E, вы можете читать (или записывать) значения в объект исключения, например, получать или устанавливать свойство Message.
Кто освобождает исключение?
Вы заметили, как исключения на самом деле являются экземплярами класса, происходящего из исключения? Ключевое слово поднимает экземпляр класса исключения. То, что вы создаете (экземпляр исключения является объектом), вы также нужно освободить. Если вы (как автор библиотеки) создадите экземпляр, освободит ли его пользователь приложения?
Вот Delphi магия: обработка исключения автоматически уничтожает объект исключения. Это означает, что когда вы пишете код в блоке "exclusive / End", он освободит память исключений.
Так что же произойдет, если ThisFunctionMightRaiseAnException фактически вызовет исключение, а вы его не обрабатываете (это не то же самое, что «съесть» его)?
Как насчет того, когда число / 0 не обрабатывается?
Когда в ваш код добавляется необработанное исключение, Delphi снова волшебным образом обрабатывает ваше исключение, отображая диалоговое окно ошибки для пользователя. В большинстве случаев этот диалог не предоставит достаточно данных пользователю (и, наконец, вам), чтобы понять причину исключения.
Это контролируется циклом сообщений верхнего уровня Delphi, где все исключения обрабатываются глобальным объектом Application и его методом HandleException.
Чтобы обрабатывать исключения глобально и показывать свой более удобный для пользователя диалог, вы можете написать код для TApplicationEvents. Обработчик события OnException.
Обратите внимание, что глобальный объект Application определяется в модуле Forms. TApplicationEvents - это компонент, который вы можете использовать для перехвата событий глобального объекта Application.