Что такое «бросить» - PullRequest
       7

Что такое «бросить»

3 голосов
/ 21 февраля 2009

Может кто-нибудь объяснить, пожалуйста, как использовать throw в обработке исключений? Что происходит, когда я выбрасываю исключение?

Ответы [ 5 ]

13 голосов
/ 21 февраля 2009

Это означает «вызвать» исключение. Когда вы «выбрасываете» исключение, вы говорите «что-то пошло не так, вот некоторые детали».

Затем вы можете «поймать» «выброшенное» исключение, чтобы позволить вашей программе изящно ухудшиться, вместо того, чтобы ошибаться и умирать.

6 голосов
/ 21 февраля 2009

«Бросок» исключения - это то, что запускает весь процесс обработки исключений.

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

Сгенерированное исключение изменит обычный порядок операций в программе таким образом, что никакие "нормальные" инструкции не будут выполняться, пока исключение не будет обработано где-либо в блоке "catch". Как только исключение перехватывается в блоке catch, и выполняется код в этом блоке catch («Обработка» исключения), нормальное выполнение программы возобновляется сразу же после блока catch.

// Do some stuff, an exception thrown here won't be caught.
try
{
  // Do stuff
  throw new InvalidOperationException("Some state was invalid.");
  // Nothing here will be executed because the exception has been thrown
}
catch(InvalidOperationException ex) // Catch and handle the exception
{
  // This code is responsible for dealing with the error condition
  //   that prompted the exception to be thrown.  We choose to name
  //   the exception "ex" in this block.
}
// This code will continue to execute as usual because the exception
//   has been handled.
3 голосов
/ 21 февраля 2009

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

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

1 голос
/ 21 февраля 2009

Создание исключения приводит к тому, что исключение поднимается вверх по стеку. Есть два основных сценария для throw.

  1. Имейте исключительное состояние, уникальное для вашего кода

    if(inputVal < 0)
    {
        throw new LessThanZeroCustomException("You cannot enter a value less than zero");
    }
    

    Приведенный выше код предполагает, что вы закодировали объект исключения с именем LessThanZeroCustomException. Я бы на самом деле не назвал это так, но Custom в названии призвано проиллюстрировать, что вы это закодировали. Скорее всего, он унаследует от

  2. Иметь исключительное состояние, которое было поймано и нуждается в отбрасывании. Обычная причина этого - регистрация. В большинстве случаев мне не нравится этот паттерн, так как вы тратите время на ловлю, регистрацию и перебрасывание снова и снова. Это потому, что большинство людей делают этот паттерн try ... catch на каждом уровне. Тьфу!

Короче говоря, throw означает «Я обнаружил исключительное условие, с которым не могу справиться, поэтому я сообщаю об этом человеку, использующему этот код, с помощью исключения».

1 голос
/ 21 февраля 2009

Бросок создает исключение для обработки. Переданный вами объект становится данными, описывающими исключение.

Пока что-то не выброшено, исключений не будет.

...