Исключения (Сравнение 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#)