Исключения (Сравнение C# и Java)

Обновлен: Ноябрь 2007

C# и Java имеют схожие процессы обработки исключений.

Во время каждого нарушения выполнения программы CLR .NET Framework создает объект Exception с подробным описанием ошибки. Базовым классом для всех классов исключений в платформе .NET Framework является класс Exception. Существует две категории исключений, являющихся производными от класса Exception, SystemException и ApplicationException. Все типы в пространстве имен System являются производными от класса SystemException, тогда как исключения, определенные пользователем, должны быть производными от класса ApplicationException, что необходимо для различения ошибок времени выполнения и ошибок приложений. Далее перечислены некоторые общие исключения System.

  • IndexOutOfRangeException. Индекс, больший размера массива или коллекции.

  • NullReferenceException. Свойство или метод ссылки, используемые до того, как ссылка была задана допустимому экземпляру.

  • ArithmeticException. В результате операции возникает переполнение или потеря точности.

  • FormatException. Неверный формат аргумента или операнда.

Как и в Java, код, который может вызвать исключение, следует поместить в блок try. Один или несколько блоков catch обеспечивают обработку ошибок; кроме того, для любого кода, который нужно выполнить, можно использовать блок finally, независимо от того, было создано исключение или нет. Дополнительные сведения см. в разделах try-catch (Справочник по C#) и try-catch-finally (Справочник по C#).

При использовании нескольких блоков catch перехваченные исключения должны размещаться в порядке увеличения универсальности, поскольку будет выполнен только первый блок catch, соответствующий созданному исключению. Для компилятора C# это будет обязательно, а для компилятора Java — нет.

В отличие от Java, C# не требует аргумента для блока catch; если аргумент отсутствует, блок catch применяется к любому классу Exception.

Например, при чтении из файла можно обнаружить FileNotFoundException или IOException, и может потребоваться сначала разместить более конкретный обработчик FileNotFoundException, как показано в следующем коде.

try
{
    // code to open and read a file
}
catch (System.IO.FileNotFoundException e)
{
    // handle the file not found exception first
}
catch (System.IO.IOException e)
{
    // handle any other IO exceptions second
}
catch
{
    // a catch block without a parameter
    // handle all other exceptions last
}
finally
{
    // this is executed whether or not an exception occurs
    // use to release any external resources
}

Можно создавать собственные классы исключений, производные от класса Exception. Например, в следующем коде создается класс InvalidDepartmentException, который можно вызвать, если, скажем, для нового Employee указан неправильный отдел. Конструктор класса для определенного пользователем исключения вызывает конструктор базового класса с помощью ключевого слова base, отправляя соответствующее сообщение.

public class InvalidDepartmentException : System.Exception
{
    public InvalidDepartmentException(string department) : base("Invalid Department: " + department)
    {
    }
}

Затем, с помощью кода, аналогичного следующему, можно создать исключение.

class Employee
{
    private string department;

    public Employee(string department)
    {
        if (department == "Sales" || department == "Marketing")
        {
            this.department = department;
        }
        else
        {
            throw new InvalidDepartmentException(department);
        }
    }
}

C# не поддерживает проверяемые исключения. В Java они объявляются с помощью ключевого слова throws, указывающего, что метод может вызвать определенный тип исключения, для обработки которого следует использовать вызывающий код.

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Исключения и обработка исключений (руководство по программированию в C#)

Другие ресурсы

Язык программирования C# для разработчиков на Java