как правильно использовать блок try-catch в C # - PullRequest
1 голос
/ 04 января 2011

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

Допустим, у меня есть 4 уровня иерархии методов, которые являются вызовами, подобными этому:

method1(){
   method2(){
       method3(){
          method4()
       }
       morecode that depend of what happend in method3
   }
   morecode that depend of what happend in method2
}

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

method1(){
   try
   method2(){
       try
       method3(){
          try
          method4()
          catch
          throw
       }
       catch
       throw
       morecode that depend of what happend in method3
   }
   catch
   return
   morecode that depend of what happend in method2
}

Это правильный путь?или я ужасно использую предложение "бросить"?

Ответы [ 7 ]

6 голосов
/ 04 января 2011

Если все, что вы собираетесь сделать в своем catch, это перебросить, вообще не беспокойтесь о try.

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

4 голосов
/ 04 января 2011

Вы должны ловить исключения на первом уровне, на котором вы хотите что-то действительно DO .

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

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

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

Предложенный заголовок по теме: Надежная обработка исключений ASP.Net

1 голос
/ 04 января 2011

(Лично) Я бы попытался обойти каждый «исключительный» случай, и затем только засоряют код блоками try/catch там, где это необходимо.

0 голосов
/ 04 января 2011

Вы можете попробовать что-то вроде этого:

        try
        {
            // Your code
        }
        catch (Exception ex)
        {
            switch (ex.Message)
            {
                case "Some system exception information":                       
                    MessageBox.Show("Your text to replace system exception information",
                     "Warning",
                     MessageBoxButtons.OK, MessageBoxIcon.Warning);  
                    break;      
                default:
                    MessageBox.Show(ex.Message,
                    "Warning",
                    MessageBoxButtons.OK, MessageBoxIcon.Warning);                       
                    break;
             }

         }
0 голосов
/ 04 января 2011

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

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

0 голосов
/ 04 января 2011

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

0 голосов
/ 04 января 2011

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

Вы также можете использовать блок Using внизу, если объекты реализуют IDisposable.

...