Обработка исключений

Термин «исключение» обозначает ситуацию, которая может возникать во время выполнения клиентского приложения и которую трудно, а порой и вообще невозможно, предусмотреть во время программирования приложения. Например, попытка подключения к ЛИНТЕР-серверу, который не существует, попытка открытия поврежденного файла или попытка установить связь с компьютером, который находится в автономном режиме. В каждом из этих случаев программист (и конечный пользователь) мало что может сделать с подобными исключительными обстоятельствами.

В подобных случаях CLR будет часто автоматически генерировать соответствующее исключение с описанием текущей проблемы. В классах ADO.NET-провайдера определено множество различных исключений, таких, как IndexOutOfRangeException, FileNotFoundException, ArgumentOutOfRangeException и т.д.

Для обработки исключений используется блок операторов try… catch, который позволяет перехватывать предопределенные ошибочные условия и выполнять соответствующие действия.

Исключения реализованы в виде классов, и если блоки перехвата ожидают появления исключений базового класса до возникновения специфического унаследованного исключения, то это специфическое исключение перехватить не получится.

Исключение содержит читабельное описание проблемы, а также детальный снимок стека вызовов на момент, когда изначально возникло исключение. Более того, конечному пользователю можно предоставлять справочную ссылку, которая указывает на определенный URL-адрес с описанием деталей ошибки, а также специальные данные, определенные программистом.

Обработка исключений подразумевает использование следующих связанных между собой сущностей:

  1. тип класса, который представляет детали исключения;

  2. член класса, способный генерировать (throw) в вызывающем коде экземпляр класса исключения при соответствующих обстоятельствах;

  3. блок кода на вызывающей стороне, ответственный за обращение к члену, в котором может произойти исключение;

  4. блок кода на вызывающей стороне, который будет обрабатывать (или перехватывать (catch)) исключение в случае его возникновения.

Примечание

Полный список сообщений LinterSqlException и рекомендации по устранению ошибок см. в документе «Справочник кодов завершения».

Пример обработки исключений

// C#
using System;
using System.Data.LinterClient;

class ExceptionSample
{
  static void Main()
  {
    string connectionString = "User ID=SYSTEM;Password=MANAGER8";
    string queryString = "execute SAMPLE_PROCEDURE";

    LinterDbConnection connection = null;
    LinterDbCommand command = null;
    try
    {
      connection = new LinterDbConnection(connectionString);
      command = new LinterDbCommand(queryString, connection);
      command.Connection.Open();
      command.ExecuteNonQuery();
    }
    catch (LinterSqlException ex)
    {
      Console.WriteLine(
        "Исключение ядра СУБД ЛИНТЕР \n" +
        "Текст сообщения: " + ex.Message + "\n" +
        "Код СУБД ЛИНТЕР: " + ex.Number + "\n" +
        "Код операционной системы: " + ex.LinterSysErrorCode + "\n");
    }
    catch (Exception ex)
    {
      Console.WriteLine(
        "Исключение ADO.NET провайдера \n" +
        "Тип ошибки: " + ex.GetType() + "\n" +
        "Сообщение: " + ex.Message + "\n");
    }
    finally
    {
      if (connection != null)
      {
        connection.Close();
      }
    }
  }
}

Результат выполнения примера:

 Исключение ядра СУБД ЛИНТЕР
Текст сообщения: [Linter error] unknown procedure
Код СУБД ЛИНТЕР: 2229
Код операционной системы: 1572865