Хвърляне на изключения

Както бе споменато по-горе, методът ProcessFile просто предава изключението на процедурата Sub Main, от която е извикан. В процедурата Sub Mai n командата за повикване също е затворена в блок Try-Catch, така че изключението ще бъде обработено. От друга страна, подобно решение изглежда малко наивно и ако класовете, които пишете, се използват от други програмисти, то става просто опасно. Но дори и нещата да се получат по някакъв начин, потребителите на вашия код едва ли ще бъдат доволни от факта, че безразборно хвърляте изключения, без да се опитвате да се справите с тях.

Най-добре е да опитате и да почистите след себе си, ако е възможно, и след това да използвате ключовата дума Throw, за да предадете обекта за изключение на повикващия. В глава 4 се споменава, че VB .NET не поддържа детерминирано завършване. Следователно, ако сте създали обект с D1 спосе метод, този метод трябва да бъде извикан преди да се хвърли изключение. Същото се отнася и за отваряне на файлове и получаване на графичен контекст. Следният фрагмент показва условната структура на такъв код:

'Създайте локален обект с метод Dispose

„Код. което може да хвърли изключения

Catch (e Като изключение)

Ако обаче наистина искате да програмирате „както се очаква“, не се ограничавайте само с рестартиране на изключението. Опитайте се да запазите кода си възможно най-описателен и да включите допълнителна информация в обекта за изключение. Има три възможности за това.

  1. Добавете смислено съобщение към изключението и го инициирайте отново. Може би новата информация ще бъде полезна.
  2. Изхвърлете изключение от един от стандартните типове, получени от типа на текущото изключение, за да опишете по-добре ситуацията.
  3. Създайте нов клас на изключение, получен от типа на текущото изключение, който ще опише ситуацията по-добре от всеки от стандартните класове.

Решенията се класират във възходящ ред на приоритет и в идеалния случай винаги трябва да използвате точка 3. На практика програмистите се ръководят от преценката си каква информация за изключението трябва да бъде предадена за по-нататъшна обработка.

Например, представете си следната ситуация: двойки ключ/стойност се четат от източника на данни и не е намерена двойка стойност за последния ключ. Програмата приема, че дадена стойност е свързана с всеки ключ, така че при опит за четене възниква неочаквано I/O изключение (четенето на данни от файл е описано в Глава 9).

Сега искате да съобщите за случващото се на обаждащия се. За да добавите ред към изключение, можете да използвате специална версия на конструктора на клас Exception:

Public Sub New (съобщение от ByVal като низ)

Следващият фрагмент добавя нов ред към обекта IOException, заявявайки, че няма стойност за последния ключ, и след това повдига изключението.

Dim excep As New IQException ("Липсваща стойност за последния ключ") Хвърли excep

След като получи хвърлено изключение, външният код получава текста на съобщението, използвайки метода Message на класа Exception и научава за проблема.

На практика в ситуации като тази е по-често да се хвърля IOException-извлечено EndOfStream-Exception. Операциите на потока от данни са обхванати в глава 9.

Втората ситуация се реализира по елементарен начин поради основното правило за наследяване: производен клас винаги може да се използва вместо основен клас. Просто трябва да създадете изключение от производния клас, който е по-подходящ за тази ситуация.

Последният случай изисква допълнителна работа, тъй като изисква дефиниране на клас, който произлиза от съществуващ клас на изключение. Да предположим, че искате да дефинирате нов клас на изключение, който произлиза от System. 10. lOException. Новият клас се различава от стария само в едно свойство ReadOnly, което връща ключ, с който не е свързана стойност на двойка: