C # - Научете се да програмирате обработка на грешки с изключения
публична невалидна лента ()
хвърли ново изключение ("Хвърлено от Rethrow.Bar"); >
В този пример Основна причини Фу, който се обажда Бар. Бар предава изключение, което улавя Фу. След това Фу по някакъв начин обработва изключението и го предава отново на метода Основна използвайки ключовата дума хвърляне.
Освобождаване на ресурси с накрая
Един труден проблем при обработката на грешки е, че кодът винаги се изпълнява
независимо дали изключението е уловено. Например сте разпределили ресурс като
като физическо устройство или файл с данни. А сега да предположим, че сте отворили
този ресурс и извика метода, преминал през изключението. Без значение може
дали вашият метод да продължи да работи с ресурса, трябва да го освободите все пак
или затворете ресурса. Тук идва ключовата дума. накрая:
публичен клас ThrowExceptionlApp
публична статична празнота ThrowExceptionQ
хвърли ново изключениеO;
публична статична празнота MainQ
Както виждаш, накрая избягва издаването на ресурс с двойно кодиране: в блок улов и след блокове опитай да хванеш. Независимо дали се прави изключение или не, кодът в накрая блокира.
Сравнение на методите за обработка на грешки
Сега, когато сме запознати с основите за предаване и улавяне на изключения, нека отделим минутка, за да сравним различните подходи за обработка на грешки в различни езици за програмиране.
Стандартният подход за обработка на грешки винаги е бил предаването на кода за грешка на повикващия
методът, който е трябвало да декодира връщаната стойност и да действа
съответно. Върнатата стойност може да бъде толкова проста, колкото да речем,
основен тип C или C ++ или може да бъде указател към по-сложен обект,
съдържаща цялата информация, необходима за оценка и разбиране на грешката. | Повече ▼
усъвършенстваните методи за обработка на грешки включват съответна пълна подсистема.
В този случай извиканият метод показва грешката в подсистемата и след това се връща
кодът на грешката на извикващия метод. След това повикващият извиква глобалната функция,
експортирани от подсистемата за обработка на грешки, за да се определи причината за последната
подсистема за регистрирана грешка. Пример за този подход е Microsoft Open
SDK за свързване на база данни (ODBC). Независимо от конкретната семантика
концепцията остава същата: методът за извикване по някакъв начин извиква друг
метод и анализира връщаната стойност, за да види дали е завършила успешно
наречен метод. Този подход, макар да е стандарт от много години, е в много отношения много
остарял. Следващите раздели описват случаи, при които се работи с изключения
има огромни предимства пред кодовете за връщане.
Предимства на обработката на изключения над кодовете за връщане
Когато се използват кодове за връщане, извиканият метод връща код за грешка и причината за грешката се обработва от извикващия метод. Тъй като обработката се извършва извън обхвата на извикания метод, няма гаранция, че извикващият метод ще провери върнатия код за грешка. Да кажем, че пишете клас CommaDelimitedFile, който реализира четене и писане на стандартно разделени файлове. По-специално вашият клас трябва да има методи за отваряне и четене на данни от файл. Със стария подход за докладване на грешки, тези методи трябва да връщат променливи, които трябва да бъдат проверени от извикващия метод, за да се определи дали обаждането е било успешно. Ако потребителят на вашия клас е извикал метода CommaDelimitedFile.Open, и след това се опитва да извика метода CommaDelimitedFile.Прочетете, без проверка дали е завършено успешно Отворете, това може да доведе до много грозни резултати (и най-вероятно това ще се случи, когато демонстрирате програмата си на много важен клиент). Но ако методът Отворете от този клас ще изведе изключение, повикващият ще бъде представен с факта, че в метода Отворете Настъпи разбивка. Въпросът е, че всеки път, когато се предаде изключение, контролът се предава нагоре, докато изключението не бъде уловено. Такъв код може да изглежда така: