digvijay dobhal Ответов: 2

Попробуйте поймать и наконец заблокировать экскрецию


Привет Эксперты,

Я прошел через Google, прежде чем разместить здесь вопрос, но не получил никакого удовлетворительного ответа.
У меня есть ниже три условия.
private string  ExcetionTest()
		{
			
			try
			{
				throw new Exception("E1");
			}
			catch (Exception ex)
			{

				throw new Exception("E2");
			}
			finally
			{
				throw new Exception("E3");
			}
		}


Случай 1.
private void button4_Click(object sender, EventArgs e)
{
		This. ExcetionTest();
}


Случай 2.
private void button4_Click(object sender, EventArgs e)
{
		try
			{
				This. ExcetionTest();

			}
			catch (Exception ex)
			{
				Throw ex;
			}
			finally
			{
				MessageBox.Show("finally");
			}

}


Случай 3.
private void Form1_Load(object sender, EventArgs e)
{
			try
			{
				throw new Exception("E1");
			}
			catch (Exception ex)
			{

				throw new Exception("E2");
			}
			finally
			{
				throw new Exception("E3");
			}
	
	
}


Когда я начинаю отладку первого случая, блок finally никогда не будет поражен, управление остановлено в блоке catch.
При отладке второго случая попробуйте поймать и, наконец, блок метода ExcetionTest() будет отлажен должным образом, но внешний, наконец, снова никогда не будет поражен.
Случай 3 действительно не понятен, когда я начинаю отлаживать один и тот же код в событии загрузки формы, пытаюсь поймать и, наконец, блок выполняется правильно. Здесь возникает вопрос: в чем разница между случаем 1 и случаем 3? Почему, наконец, ударил в случае.3, но не упаковал 1.

Спасибо,

BillWoodruff

Вы пробовали установить точку останова в первой строке кода в каждом случае, а затем одношаговый (F11), чтобы наблюдать, как движется поток управления ? Имейте в виду, что бросать исключение в исключение немного странно.

digvijay dobhal

Да, я сделал один шаг, но контроль не перешел к последнему блоку в случае 1, а остановился в улове. в то время как в случае 3 контрольный ход, наконец, после улова.

Sergey Alexandrovich Kryukov

Зачем искать "ответы" там, где нужно применять общее понимание и просто логику, а выводы делать самому? Есть какие-то особые опасения?
И зачем обсуждать явно патологический код? (Ну, я бы понял, что это делается просто для того, чтобы получить некоторое понимание.) Зачем возиться с бланками?
—СА

2 Ответов

Рейтинг:
20

CHill60

У вас тут довольно обычная ситуация.

В случае, если элемент управления 1 не просто "останавливается" - вы получаете ошибку "необработанное исключение" - что именно так и написано - Visual Studio понятия не имеет, что вы хотите сделать с создаваемым исключением.

В случае 2 VS знает, что вызывающий процесс имеет try-catch, поэтому он может пузырить исключение вверх. Он может обработать предложение finally-для текущего исключения и передать новое исключение вверх по строке. Затем вы сталкиваетесь с проблемой "необработанного исключения" в предложении catch вызывающей кнопки.

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

Ситуация с загрузкой формы действительно немного сбивает меня с толку - я ожидал, что она будет вести себя так же, как и случай 2. Но если вы внимательно посмотрите на выходной кадр в VS, то увидите, что были подняты оба исключения. Но, как я уже сказал, Это довольно надуманная ситуация, которую я никогда не ожидал бы увидеть в "реальном" коде.

Вы можете найти эти статьи на эту тему полезными. CodeProject:
Обработка исключений для начинающих C# [^]
Рекомендации по обработке исключений в .NET[^]
MSDN:
Исключения и обработка исключений[^]
Рекомендации по исключениям[^]


BillWoodruff

+5 идеальный ответ !

Рейтинг:
1

Sergey Alexandrovich Kryukov

Всего несколько заметок: все finally ветви не имеют смысла, потому что до них никогда не дотянуться. Ключ в том, что вы используете только один тип исключения, System.Exception что покрывает 100% всех возможных исключений. Этот факт делает ваши исследования не очень продуктивными, почти бесполезными. Вы должны идти вперед.

—СА