Что произойдет, если в Catch-блоке на С# возникает исключение. Кроме того, что будет результатом вызова в этом случае

Это был вопрос интервью, довольно простой, но я не уверен в ответе.

Что произойдет, если в блоке catch произойдет исключение?

Я пытаюсь привести пример небольшой прога того, что интервьюер пытался спросить меня, пожалуйста, исправьте мою программу, если она не компилируется, я действительно новичок в этом. Нижняя строка - это то, что происходит, если в Catch возникает исключение, и каково будет значение case caller int hat.

Например, у меня есть следующее:

double Calculate(int x)
{
    try
    {
        x = x/2;
    }
    catch(Exception ex)
    {
        Console.Writeline("Message: "+ ex.Message);
    }
    finally
    {
      x = 10;
    }
    return x;
}

double myResult = Calculate(x); //x can be any number or 0 for example

Теперь есть два вопроса:

  • Что произойдет, если исключение произойдет в блоке catch? Также, как его решить? (Это простой пример того, что интервьюер задавал аналогичный вопрос).

  • Что произойдет с myResult, если исключение произойдет в методе Calculate (x)? Какова будет его ценность во всех случаях? (Пожалуйста, объясните каждый случай с примером)

Я хотел бы это понять и с подробным объяснением.

Большое вам спасибо.

Ответы

Ответ 1

Исключение, созданное в блоке catch, будет вести себя так же, как исключение, созданное без него - оно будет подниматься до стека, пока оно не будет поймано в блоке catch более высокого уровня, если таковое существует. Это вполне нормально, если вы хотите изменить или обернуть исходное исключение; то есть:.

public void MyStartMethod
{
    try
    {
        //do something
        MyBadMethod();
    }
    catch(MySpecialException mse)
    {
        //this is the higher level catch block, specifically catching MySpecialException 
    }
}

public void MyBadMethod()
{
    try
    {
        //do something silly that causes an exception
    }
    catch (Exception e)
    {
        //do some logging

        throw new MySpecialException(e);
    }
}

public class MySpecialException : Exception 
{   
    public MySpecialException(Exception e) { ...etc... }
}

В вашем случае myResult будет иметь любое значение, которое оно имело до этого, если оно еще осталось в области видимости.

Ответ 2

В случае, если его дочерняя функция, исключение будет отправлено в блок catch функции вызова

В случае, если его основная функция исключение будет выбрано и обрабатывается вызывающим методом или unhanded

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

Они обычно используются для исключения или регистрации исключения.

Даже если есть что-то, вы можете использовать блок Finally, чтобы любые занятые ресурсы могли быть переданы.

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

ДОКУМЕНТАЦИЯ MSDN

Ответ 3

Информация ниже поможет (из предыдущего моего ответа на соответствующий вопрос). Если ваш блок catch генерирует исключение, и нет других блоков catch, чтобы обработать его, кроме того, который его вызвал, он будет продолжать возвращаться, тогда "Windows обрабатывает его".

Если возникает исключение, CLR пересекает стек вызовов, ищущий совпадающее выражение catch. Если CLR не найдет подходящий, или Exception получает re throw каждый раз, Exception вырывается метода Main(). В этом случае Windows обрабатывает исключение.

Обработка событий в консольных приложениях проще всего понять, потому что в CLR отсутствует специальная обработка. Исключение составляет оставляя Прикладную нить, если не поймать. CLR открывает окно запрашивая отладку или выход из приложения. Если пользователь выбирает debug, начинается отладчик. Если пользователь хочет закрыть, Выходы приложений и исключение сериализуются и записываются в консоли.

Ответ 4

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

try
{}
catch
{
  throw;
}

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

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

Ответ 5

Нет реального возвращаемого значения. Исключение будет "возвращено".

Это приемлемый код для компилятора:

public bool fooMethod()
{
  throw new NotImplementedException();
}

В вашем случае myResult не будет изменено.