2015-04-11 3 views
0

У меня есть следующий код:бросания исключения несколько раз

static int GetLastAddedIDHelper(OleDbConnection connection) 
    { 
     try 
     { 
      // Init variables. 
      OleDbCommand command = null; 
      string cmdText = "SELECT @@IDENTITY"; 

      if (connection != null) 
       command = new OleDbCommand(cmdText, connection); 
      else 
       throw new ArgumentNullException("connection", "The connection was passed as null. Therefore the globally used connection is used but was never set."); 

      return (int)command.ExecuteScalar(); 
     } 
     catch (Exception ex) { throw ex; } 
    } 

    public static int GetLastAddedID() 
    { 
     try 
     { 
      return GetLastAddedIDHelper(_Connection); 
     } 
     catch (Exception ex) { throw ex; } 
    } 

    private void Button_Click_Action() 
    { 
     try 
     { 
      int i = AccessDbServiceBase.GetLastAddedID(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ExceptionHandler.GetExceptionMessage(ex)); 
     } 
    } 

Приведенные выше код будет получить последний вставленный ID из базы данных Access для меня. Теперь, чтобы сделать это, Button_Click_Action позвонит GetLastAddedID, и это позвонит GetLastAddedIDHelper. Когда exception происходит в GetLastAddedIDHelper, я исключаю исключение до основного метода Button_Click_Action.

Мне интересно, если я делаю это правильно, например, нужен ли GetLastAddedID, следует ли использовать throw вместо throw ex, ...?

ответ

2

Обработка исключений в GetLastAddedIDHelper и GetLastAddedID не служит никакой полезной цели в этом случае. Ваше намерение, казалось бы, состоит в том, чтобы просто поймать исключение, а затем ничего не делать с ним, кроме как восстановить его. Если это так, то зачем беспокоиться об этом? Просто пусть исключение распространяется на стек до тех пор, пока обработчик исключений, который может обрабатывать его, не получит его в методе Button_Click_Action в этом случае.

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

+0

Так что, если методы 'GetLastAddedIDHelper' и' GetLastAddedID' используются только в других методах, которые будут иметь обработку исключений, лучше просто оставить «try ... catch», если бросать - это единственное, что я делаю? – Krowi

+0

Да, это недостаток. И если вы окажетесь в ситуации, когда вам нужно реконструировать (вы, вероятно, не будете делать это очень часто, но есть некоторые варианты использования), то используйте «throw» для правильного восстановления. Вы можете найти «C# rethrow» в Google для получения более подробной информации о причинах. –

0

Возможно, вы захотите сделать throw;, потому что throw ex; сбросит трассировку стека.

Смежные вопросы