velmahesh Ответов: 2

Какой блок catch выполняется первым


when we have multiple catch for a single try block? and why ? 


Что я уже пробовал:

<pre>
try
{
//some code
}
catch(SqlException sqlex)
{
Console.WriteLine("sqlexception is returned")
}
catch(FormatException fx)
{
Console.WriteLine("FormatException is returned")
}
catch(Exception ex)
{
Console.WriteLine("Mainexception is returned");
}
catch
{
Console.WriteLine("exception without any args is returned");
}

2 Ответов

Рейтинг:
15

raddevus

Они проваливаются, поэтому первый (сверху), который соответствует типу исключения, будет выполнен, а остальные-нет.

Кроме того, ваш последний улов никогда не будет поражен.

Вы можете доказать это, запустив:

void Main()
{
	try
	{
		throw new Exception();
	}
	catch(SqlException sqlex)
	{
		Console.WriteLine("sqlexception is returned");
	}
	catch(FormatException fx)
	{
		Console.WriteLine("FormatException is returned");
	}
	catch(Exception ex)
	{
		Console.WriteLine("Mainexception is returned");
	}
	catch
	{
		Console.WriteLine("exception without any args is returned");
	}
}


Вот еще один пример, который вы можете попробовать. Он будет печатать "недопустимо", потому что исключение InvalidOperationException возникает при попытке открыть недопустимое соединение.

void Main()
{
	try
	{
		SqlConnection conn = new SqlConnection("");
		conn.Open();
	}
	catch(SqlException sqlex)
	{
		Console.WriteLine("sqlexception is returned");
	}
	catch (InvalidOperationException iox)
	{
		Console.WriteLine("invalid");
	}
	catch(FormatException fx)
	{
		Console.WriteLine("FormatException is returned");
	}
	catch(Exception ex)
	{
		Console.WriteLine("Mainexception is returned");
	}
	catch
	{
		Console.WriteLine("exception without any args is returned");
	}
}


Однако если вы удалили улов InvalidOperationException, то он упадет до "Mainexception возвращается".


Рейтинг:
12

Vincent Maverick Durano

Просто чтобы добавить к существующему предоставленному решению...

Цитата:
Какой блок catch выполняется первым, когда у нас есть несколько catch для одного блока try?


В зависимости от типа исключения, генерируемого кодом приложения. С тех пор как ты поймал несколько штук Exception тогда типы:

(а) когда ваш SQL-сервер выдает предупреждение или ошибку, то SqlException блок catch будет выполнен.
(b) Когда вы пытаетесь преобразовать что-то, что не очень хорошо сформировано, или формат аргумента недействителен, то FormatException блок catch выполняется.
(c) когда произошла нулевая ссылка или недопустимая операция, то она будет отправлена в Exception поймать блок, так как вы специально не справлялись NullReferenceException и InvalidOperationException. Этот Exception тип обычно используется для обработки универсальных исключений.

Цитата:
и почему ?


Множественный Catch блок обычно используется для обработки различных видов Exception Точно так же, как в вашем примере: SqlException, FormatException и Exception типы (имейте в виду, что существует много типов исключений в зависимости от того, какую операцию вы пытаетесь выполнить).

Исключения-это тип ошибки, возникающий во время выполнения приложения. Errors как правило, это проблемы, которые происходят необъяснимо. В то время как, Exceptions ожидается, что они произойдут в коде приложения, поэтому важно обрабатывать ожидаемые исключения и перехватывать их специально, чтобы легко определить, какие из них вызывают возникновение исключения. Обработка конкретных исключений очень полезна при ведении некоторых журналов и позволяет приложению передавать управление из одной части кода в другую.