Исключения против кодов возврата: мы что-то теряем (получая что-то другое)? - PullRequest
8 голосов
/ 15 января 2009

Мой вопрос довольно расплывчат: o) - Но вот пример:

Когда я писал код на C, я мог регистрировать значение счетчика, когда что-то не получалось:

   <...>
   for ( int i = 0 ; i < n ; i++ )
      if ( SUCCESS != myCall())
         Log( "Failure, i = %d", i );
   <...>

Теперь, используя исключения, я получаю это:

  try
   {
      <...>
      for ( int i = 0 ; i < n ; i++ )
         myCall();
      <...>
   }
   catch ( Exception exception )
   {
      Log( "Failure ! Maybe in myCall() ? Don't know. i's value ? No clue." );
   }

Конечно, можно объявить «i» вне оператора try / catch (и это то, что я делаю). Но мне это не нравится - мне нравится объявлять переменные там, где они используются, а не раньше.

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

Спасибо заранее! Sylvain.

ДОБАВЛЕНО: myCall () - неясный вызов API - я понятия не имею, что он может выдать. Кроме того, я могу, конечно, добавить блок Try / Catch вокруг каждого вызова, но тогда мне лучше использовать коды возврата? Могу ли я добавить много шума вокруг важных строк кода?

Ответы [ 15 ]

2 голосов
/ 15 января 2009

Перво-наперво. Если вы ловите исключение, вы ошибаетесь. Вы должны отлавливать ожидаемое вами исключение.

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

Например, ArrayIndexOutOfBoundsException будет содержать адресуемый индекс.

2 голосов
/ 15 января 2009

Конечно, можно объявить «i» вне оператора try / catch (и это то, что я делаю).

Что ж ... если вам действительно нужно знать значение i, тогда это похоже на средство регистрации - структурированная обработка исключений, вероятно, не лучший способ. Если вы хотите обработать исключение условно (т. Е. Только при отладке), поместите try block внутри цикла. Так как это может снизить производительность (в зависимости от вашей среды), делайте это только в режиме отладки.

1 голос
/ 15 января 2009

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

Обычная техника получения «i» - перехватывать исключение и добавлять к нему дополнительные данные (метод istream), прежде чем выбросить его. Это редко, когда это необходимо, но если вы настаиваете ...

1 голос
/ 15 января 2009

Хорошо! Вы могли бы сделать это:

   try
   {
      <...>
      for ( int i = 0 ; i < n ; i++ )
         try {
            myCall();
         } catch(Exception e) {
            println("bloody hell! " + i);
         }
      <...>
   }

Я думаю, что исключения круче, чем Java показывает вам. Что действительно интересно, так это заставлять отладчик вызывать каждое исключение, которое не обрабатывается, а затем просматривать стек в момент сбоя, чтобы вы могли проверить i без необходимости изменения строки кода. То есть, я полагаю, для каких исключений должны быть.

0 голосов
/ 15 января 2009

Вы можете получить из RuntimeException и создать собственное исключение, которое выдает mycall (). Тогда вы можете поймать это с помощью try / catch.

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