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

Что такое исключение?

  • Исключение .NET - это объект, который описывает условие ошибки во время выполнения.
  • Когда возникает условие ошибки во время выполнения, создается объект, который представляет ошибку времени выполнения и генерируется в методе, вызвавшем ошибку.
  • Этот метод может обрабатывать само исключение или передавать его. Как бы то ни было, исключение попадает и обрабатывается в какой-то момент.
  • Исключения могут быть сгенерированы CLR или могут быть сгенерированы кодом.
  • Исключения, брошенные .NET, связаны с первичными ошибками, которые нарушают правила языка C# или ограничения среды выполнения .NET
  • Обработка исключений .NET выполняется с помощью try, catch, throw и finally.
  • Блок try содержит операторы программ, которые необходимо отслеживать

для исключений. Если в блоке try происходит исключение, оно бросается. Ваш код может перехватывать исключения, которые автоматически генерируются CLR.

Обработка исключений .NET выполняется с помощью try, catch, throw и finally.

Исключение:

Блок try содержит программные инструкции, которые необходимо отслеживать для исключений. Если в блоке try происходит исключение, оно выбрасывается.
Ваш код может перехватывать исключения, которые автоматически генерируются CLR. Мы используем ключевое слово throw для ручного исключения.

private void DoSomething(string value)
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentNullException(“value”, “parameter value cannot be null”);
}
...
}

Код, который должен выполняться всегда до возвращения метода, сохраняется в блоке finally.

Обработчик исключений пытается восстановить из-за ошибки или обнаруживает, что ошибка не может быть восстановлена, а затем обеспечивает легкий выход из программы.
Оператор finally также связан с оператором try и содержит блок кода, который выполняется независимо от того, происходит ли исключение или нет

Исключение сбоя:

Оператор catch связан с оператором try и содержит блок кода для обработки исключения, которое встречается в блоке try.
Блок catch выполняется только в том случае, если в блоке try возникает исключение определенного типа.
Оберните код, который потенциально может вызвать исключение внутри try {}, за которым следует catch {}.

try
{
DoSomething(null);
}
catch (ArgumentNullException ex)
{
Console.WriteLine(“Exception: “ + ex.Message);
}

После попытки вы можете иметь несколько блоков catch. .NET войдет в первый блок catch, который полиморфно совместим с заброшенным исключением. Если у вас есть код, который генерирует как ArgumentException, так и ArgumentNullException, например, порядок ваших блоков catch важен, потому что
ArgumentNullException является дочерним классом ArgumentException.

Вот пример того, что не надо делать:

{
throw new ArgumentNullException();
}
catch (ArgumentException ex)
{
//достигнет здесь
}
catch (ArgumentNullException ex)
{
//здесь не дойдет!
}

Поскольку ArgumentNullException является типом ArgumentException, а ArgumentException является первым в списке catch, он будет вызван.
Правило: всегда упорядочивайте блоки catch catch в большинстве случаев в первом порядке.

try
{
throw new ArgumentNullException();
}
catch (ArgumentNullException ex)
{
//теперь мы достигнем здесь!
}
catch (ArgumentException ex)
{
//уловить любое другое исключение ArgumentException или ребенка
}

Блок Catch

Оператор try содержит блок кода, в котором может возникнуть исключение.

Общая структура этих утверждений приведена ниже:

try {
statement(s)
}
catch (exceptiontype name){
statement(s)
}
finally {
statement(s)

Пример:

class Hello {
public static void Main (string[] args ) {

System.Console.WriteLine("Hello”);
System.Console.WriteLine(args[0]);
}
}

Что произойдет, если вы запустите программу без предоставления аргумента командной строки? Среда выполнения генерирует исключение следующим образом:

Hello
Unhandled Exception: System.IndexOutOfRangeException: Index was outside the bounds of the array at Hello.Main(string[] args)

Поскольку мы не приводили Hello аргумент командной строки, в args ничего не было [0]. Поэтому .NET дал это не слишком дружественное сообщение об ошибке
«Исключение System.IndexOutOfRangeException». Мы можем исправить эту проблему, проверив длину массива перед доступом к его первому элементу. Это хорошо работает в простых случаях, но если нам нужно проверить каждое возможное условие ошибки в каждой строке кода, наш код будет раздутым с большей ошибкой, чем фактический код.

Более того, мы также должны проверить ошибки в условиях ошибки.
Цель обработки исключений - описать регулярный поток программы в одной части кода, не задумываясь обо всех особых
случаях. Затем мы можем охватить исключительные случаи в отдельном блоке кода. Это дает более понятный код, так как здесь не требуется
прерывать поток программы, чтобы проверить каждое возможное условие ошибки. Для среды выполнения требуется переход от обычного
потока программы к обработчику исключений, когда происходит исключительное событие.

На практике код может быть написан внутри блоков try-catch. Заявления, которые, как предполагается, генерируют исключения, записываются внутри блока try. Внутри блока try мы можем действовать так, как будто ничего не пошло или может пойти не так. Затем, в блоках catch, мы можем написать логику программы, которая обрабатывает все особые случаи.

Here's an example of exception handling in C# using the Hello World
program:

class ExceptionalHello
{
public p static void Main (string []args)
{

try
{
System.Console.WriteLine("Hello + args[0]);
}
catch (Exception ex1)
{
System.Console.WriteLine("Hello !!”);}
}
}

Блок finally

Блок finally связан с блоком try и содержит блок операторов, которые выполняются независимо от того, происходит ли исключение
или нет в блоке try. Наконец, он определяет код, который выполняется всегда.
При нормальном выполнении он выполняется после блока try.
Когда возникает исключение, оно выполняется после обработчика, если оно есть или до распространения, в зависимости от случая

  1. Утверждение finally связано с оператором try и содержит оператор блока, который выполняется независимо от того, происходит ли исключение или нет внутри блока try
  2. Определяет код, который всегда выполняется
  3. При нормальном выполнении он выполняется после блока try
  4. когда возникает исключение, оно выполняется после обработчика, если какое-либо или до распространения, в зависимости от обстоятельств

Конструкция try-catch-finally может быть записана как:

(i) try { } catch { } finally { }
(ii) try{ } catch { }
(iii) try{ } finally { }

Пример:

try
{
int x, y=5, z=0;
x = y/z;
int []myArray = new int[20];
myarray[20] = 1000;
}
catch (DivideByZeroException ae)
{
//заявления
}
catch (IndexOutOfRangeException et)
{
//заявления
}
finally
{
//заявления
}
  1. Когда выполнение достигает x = y / z; поскольку значение z равно нулю, CLR генерирует исключение DivideByZeroException.
  2. Теперь необходимо выполнить соответствующий блок catch. CLR ищет соответствующий блок catch в том порядке, в котором он написан
  3. Первый блок catch является подходящим, поскольку он написан для обработки DivideByZeroException. Этот первый блок catch выполнен.
  4. Будет выполнен только один блок catch
  5. Затем выполнение выполняется для окончательного блокирования
  6. Теперь выполнение переходит к следующему утверждению:

Пользовательское исключение

  1. Пользовательские исключения могут быть определены согласно требованию
  2. Создайте настраиваемый класс исключений, наследуя класс Exception
  3. Чтобы поднять пользовательское исключение в подходящий момент, используйте throw myExcepObj;
class myException : Exception
{
/* Внедрить конструкторы, просто вызвав конструктор базового класса */
public myException() : base() {}
public myException( string msg ) : base(msg) {}
}

Пример:

using System;
class InvalidAgeException : Exception {
public InvalidAgeException() : base() {}
public InvalidAgeException(string msg) : base(msg)
{}
}
class Person {
private int age;
public int Age
{
set {
if ( value >= 19 && value <= 60 )
age = value;
else{
InvalidAgeException
expObj = new InvalidAgeException("The Age input has to be with 19 to 60");
throw expObj;
}
}
get {
return age;
}
}
}
class Test {
public static void Main(string []args) {
Person personObj = new Person();
Console.Write("Enter the age : ");
try {
string ageInput = Console.ReadLine();
/* convert the string value into int value
with the help of int.parse() method */
personObj.Age = int.Parse( ageInput );
Console.WriteLine("Valid age input");
}
catch(InvalidAgeException expObj){
Console.WriteLine( expObj.Message );
}
}
}

 

Источник: http://www.csharpstar.com/exception-handling-csharp/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Adblock
detector