Ево једне занимљиве чињенице: Не код је без грешака - у ствари, неки код је намерно пун „грешака“.
Шта је грешка у апликацији? Грешка је погрешно кодирано решење проблема. Такви су логичке грешке што би могло довести до погрешних резултата функција где се чини да је све лепо састављено, али резултат апликације је потпуно неупотребљив. Са логичким грешкама, ан апликација може или не престаје да ради.
Изузеци могу обухватати грешке у вашем коду где покушавате да поделите бројеве са нулом или покушате да користите ослобођене меморијске блокове или покушате да унесете погрешне параметре у функцију. Међутим, изузетак у апликацији није увек грешка.
Изузеци и класа изузетака
Изузеци су посебни услови који захтевају посебно руковање. Када дође до стања грешке, програм покреће изузетак.
Ви (као писац апликација) управљаћете са изузецима како бисте апликацију учинили склонијом грешкама и одговорили на изванредне услове.
У већини случајева наћи ћете се као писац апликација и такође писац библиотеке. Стога бисте требали знати како да изузете изузеће (из своје библиотеке) и како да се носите са њима (из своје пријаве).
Чланак о руковање грешкама и изузецима пружа неке основне смернице о томе како се заштитити од грешака помоћу три / осим / енд и три / финал / енд заштићених блокова да реагују на или се баве изузетним условима.
Једноставан покушај / осим заштитних блокова изгледа као:
покушати
ТхисФунцтионМигхтРаисеАнЕкцептион ();
осим// руковати било којим изнимкама које су овдје приказане у ТхисФунцтионМигхтРаисеАнЕкцептион ()
крај;
ТхисФунцтионМигхтРаисеАнЕкцептион би у својој имплементацији могла имати линију кода попут
подићи Изузетак. Креирај ('посебан услов!');
Изузетак је посебна класа (једна од неколико без Т испред имена) дефинисана у јединици сисутилс.пас. Јединица СисУтилс дефинише неколико потомака изузетка посебне намене (и тако ствара) хијерархија класа изузетака) попут ЕРангеЕррор, ЕДивБиЗеро, ЕИнтОверфлов итд.
У већини случајева, изузеци с којима бисте поступали у заштићеном блоку пробати / осим, не би били изузетак (основна) класа, али неке посебне класе потомка Екцептион-а дефинисане или у ВЦЛ-у или у библиотеци која сте Користећи.
Руковање изузецима помоћу Три / осим
Да бисте ухватили и обрадили тип изузетка, конструисали бисте руковаоц изузетака "он типе_оф_екцептион до". "Изузетно не" изгледа прилично као класична изјава случаја:
покушати
ТхисФунцтионМигхтРаисеАнЕкцептион;
екцептон ЕЗероДивиде добегин// нешто када се дели са нуломкрај;
на ЕИнтОверфлов добегин// нешто када је превелик израчун целог бројакрај;
елсебегин// нешто када се поставе друге врсте изузетакакрај;
крај;
Имајте на уму да би други део узео све (друге) изузетке, укључујући оне о којима ништа не знате. Уопштено, ваш код треба да обрађује само изузетке са којима знате како се рукујете и очекујете да буду бачени.
Такође, никада не смете „јести“ изузетак:
покушати
ТхисФунцтионМигхтРаисеАнЕкцептион;
осим
крај;
Појести изузетак значи да не знате како да поступате са изузетком или не желите да корисници виде изузетак или било шта између тога.
Када обрађујете изузетак и треба вам више података из њега (уосталом, то је инстанца класе), а не само врсту изузетка који можете да урадите:
покушати
ТхисФунцтионМигхтРаисеАнЕкцептион;
екцептон Е: Изузетак добегин
СховМессаге (Е.Мессаге);
крај;
крај;
„Е“ у „Е: Изузетак“ је привремена варијабла изузетка типа која је наведена након знака колоне (у горњем примеру основна класа изузећа). Помоћу Е можете читати (или писати) вредности објекту изузетка, попут добити или поставити својство поруке.
Ко ослобађа изузетак?
Да ли сте приметили како су изузеци примери класе која силази из изузетка? Кључна реч подиже инстанцу класе изузетка. Оно што створите (изузетак је предмет), такође треба да се ослободим. Ако ви (као писац библиотеке) створите инстанцу, да ли ће је корисник апликације ослободити?
Ево га Делпхи магија: Руковање изузећем аутоматски уништава објект изузетка. То значи да када напишете код у блок "осим / крај", ослободиће меморију изузетака.
Па шта се дешава ако ТхисФунцтионМигхтРаисеАнЕкцептион уствари изузме изузетак и ви не поступате са њим (то није исто што и „појести“)?
Шта је са када се број / 0 не обрађује?
Када се у ваш код баци неовлаштени изузетак, Делпхи поново чаробно обрађује вашу изузећу показујући дијалог грешке кориснику. У већини случајева, овај дијалог неће пружити довољно података да корисник (и на крају ви) схватите узрок изузећа.
Ово се контролише од стране Делфове петље поруке на највишем нивоу где све изузеци се обрађују глобалним апликацијским објектом и његовом методом ХандлеЕкцептион.
Да бисте глобално управљали изузецима и показали свој властити дијалог који је више прилагођен кориснику, можете написати код за ТАпплицатионЕвентс. ОнЕкцептион руковалац догађаја.
Имајте на уму да је глобални објект апликације дефинисан у јединици Обрасци. ТАпплицатионЕвентс је компонента коју можете користити за пресретање догађаја глобалног објекта апликације.