Ето един интересен факт: Не код е без грешки - всъщност някой код е пълен с „грешки“ нарочно.
Какво е грешка в приложение? Грешката е неправилно кодирано решение на проблем. Такива са логически грешки Това може да доведе до грешни резултати във функциите, когато всичко изглежда добре събрано, но резултатът от приложението е напълно неизползваем. С логически грешки, an приложение може или не може да спре да работи.
Изключенията могат да включват грешки във вашия код, при които се опитвате да разделите числа с нула, или опитате да използвате освободени блокове памет или да опитате да предоставите грешни параметри на функция. Изключение в приложение обаче не винаги е грешка.
Изключения и клас на изключенията
Изключение правят специалните условия, които изискват специално боравене. При възникване на състояние на тип грешка програмата повдига изключение.
Вие (като писател на приложения) ще се справите с изключения, за да направите приложението си по-податливо на грешки и да отговорите на изключителното състояние.
В повечето случаи ще се окажете, че сте писател на приложения, а също и писател на библиотеката. Така че ще трябва да знаете как да увеличите изключенията (от библиотеката си) и как да се справите с тях (от приложението си).
Статията за грешки и изключения при работа предоставя някои основни насоки за това как да се предпазите от грешки с помощта на try / освен / end и try / final / end защитени блокове, за да отговорите на или да се справите с изключителни условия.
Един прост опит / с изключение на защитните блокове изглежда така:
опитвам
ThisFunctionMightRaiseAnException ();
с изключение// обработвайте всички изключения, повдигнати в ThisFunctionMightRaiseAnException () тук
край;
ThisFunctionMightRaiseAnException може да има при прилагането си ред от код
рейз Изключение. Създаване („специално условие!“);
Изключението е специален клас (един от няколкото без T пред името), определен в sysutils.pas единица. Единицата SysUtils определя няколко потомци на изключение със специална цел (и по този начин създава йерархия на класовете за изключения) като ERangeError, EDivByZero, EIntOverflow и т.н.
В повечето случаи изключенията, които бихте обработили в защитения блок за опит / с изключение, не биха били от изключението (основен) клас, но на някакъв специален потомък клас Exception, дефиниран или в VCL, или в библиотеката, която сте използвайки.
Работа с изключения с помощта на опита / с изключение
За да хванете и обработите тип изключение, бихте конструирали обработващ изключение "on type_of_exception do". „Изключение прави“ прилича почти на класическия случай:
опитвам
ThisFunctionMightRaiseAnException;
excepton EZeroDivide dobegin// нещо, когато се дели на нулакрай;
На EIntOverflow dobegin// нещо, когато твърде голямо изчисление за цяло числокрай;
elsebegin// нещо, когато са издигнати други видове изключениякрай;
край;
Имайте предвид, че останалата част ще вземе всички (други) изключения, включително тези, за които нищо не знаете. Като цяло, вашият код трябва да се справя само с изключения, които всъщност знаете как да боравите и очаквате да бъдат хвърлени.
Освен това никога не трябва да "ядете" изключение:
опитвам
ThisFunctionMightRaiseAnException;
с изключение
край;
Яденето на изключението означава, че не знаете как да се справите с изключението или не искате потребителите да виждат изключението или нещо между тях.
Когато боравите с изключението и имате нужда от повече данни от него (в края на краищата това е екземпляр от клас), а не само вида на изключението, което можете да направите:
опитвам
ThisFunctionMightRaiseAnException;
excepton Д: Изключение dobegin
ShowMessage (E.Message);
край;
край;
"E" в "E: Изключение" е временна променлива от изключение от тип, посочена след символа на колоната (в горния пример базовия клас за изключение). С помощта на E можете да четете (или записвате) стойности на обекта на изключение, като например да получите или зададете свойството Съобщение.
Кой освобождава изключението?
Забелязали ли сте как изключения всъщност представляват случаи на клас, спускащ се от Exception? Ключовата дума за повишаване хвърля екземпляр от клас изключение. Какво създавате (изключителният екземпляр е обект), вие също трябва да се освободи. Ако вие (като писател на библиотеки) създадете екземпляр, ще го освободи ли потребителят на приложението?
Ето това Delphi магия: Работата с изключение автоматично унищожава обекта на изключение. Това означава, че когато напишете кода в блока "освен / край", той ще освободи паметта на изключенията.
И така, какво се случва, ако ThisFunctionMightRaiseAnException всъщност повдигне изключение и не се справяте с него (това не е същото като "яденето")?
Какво ще кажете, когато числото / 0 не се обработва?
Когато в кода ви бъде хвърлено необработено изключение, Delphi отново магически обработва вашето изключение, като показва на потребителя диалоговия прозорец за грешка. В повечето случаи този диалогов прозорец няма да предостави достатъчно данни за потребителя (и накрая вие), за да разбере причината за изключението.
Това се контролира от веригата за съобщения от най-високо ниво на Delphi къде всичко изключенията се обработват от глобалния обект Application и неговия метод HandleException.
За да боравите с изключенията в световен мащаб и да показвате свой собствен по-удобен за потребителя диалог, можете да напишете код за TApplicationEvents. OnException обработчик на събития.
Обърнете внимание, че глобалният обект на приложение е дефиниран в единицата Форми. TApplicationEvents е компонент, който можете да използвате за прехващане на събитията от глобалния обект на приложение.