2013-09-16 2 views
0
private void SetConnection(string id, string classCode) 
    { 
     try 
     { 
      _connection = new SqlConnection { ConnectionString = Settings.Default.CurrentConnection }; 
      _connection.Open(); 
      while (_connection.State == ConnectionState.Connecting || _connection.State == ConnectionState.Closed) 
       Thread.Sleep(1000); 

      _command = new SqlCommand(Settings.Default.EligibilityBenefitSP, _connection); 
      if (_command != null) _command.CommandType = CommandType.StoredProcedure; 
      _command.Parameters.Add("@ClassCode", SqlDbType.NVarChar).Value = classCode; 
      _command.Parameters.Add("@Id", SqlDbType.NVarChar).Value = id; 
     } 
     catch (Exception e) 
     { 
      throw new Exception(e.Message + " " + Settings.Default.EligibilityBenefitSP); 
     } 

    } 

    public Collection<EligibilityClassBenefit> ExtractEligibilityClassBenefit(string id, string classCode) 
    { 
     SetConnection(id, classCode); 
     Collection<EligibilityClassBenefit> eclassBene = new Collection<EligibilityClassBenefit>(); 
     SqlDataReader reader = null; 
     try 
     { 
      _command.CommandTimeout = 420; 
      if (_connection.State == ConnectionState.Open) 
       reader = _command.ExecuteReader(CommandBehavior.CloseConnection); 
      else 
       throw new Exception("Connection Closed"); 

       /* no data */ 
       if (!reader.HasRows) return null; 

       while (reader.Read()) 
       { 
        EligibilityClassBenefit eligibilityClassBenefit = new EligibilityClassBenefit 
        { 
         EffectiveDate    = reader["EffectiveDate"].ToString(), 
         EndDate      = reader["EndDate"].ToString(), 
         InitialEffectiveDate   = reader["InitialEffectiveDate"].ToString(), 
         IsAdministrativeServicesOnly = reader["IsAdministrativeServicesOnly"].ToString(), 
         EffectiveProvision   = reader["EffectiveProvision"].ToString(), 
         ProbationPeriod    = reader["ProbationPeriod"].ToString(), 
         UnderwritingType    = ExtractUnderwritingType(id), 
         ProbationPeriodUnit   = reader["ProbationPeriodUnit"].ToString(), 
         StateOfIssue     = reader["StateOfIssue"].ToString(), 
        }; 
        BenefitData benefitData = new BenefitData(); 
        eligibilityClassBenefit.Benefit = benefitData.ExtractBenefit(reader, id, classCode); 

        EligibilityClassBenefitBusinessLevelData eligibilityLevelData = new EligibilityClassBenefitBusinessLevelData(); 
        eligibilityClassBenefit.EligibilityClassBenefitBusinessLevelNodes = eligibilityLevelData.ExtractBenefitBusinessLevel(reader); 

        eclassBene.Add(eligibilityClassBenefit); 
      } 
      return eclassBene; 
     } 
     catch (Exception e) 
     { 
      throw new Exception(e.InnerException.Message + e.InnerException.StackTrace); 
     } 
     finally 
     { 
      //if (_connection.State == ConnectionState.Open) _connection.Close(); 
      if (reader != null) reader.Close(); 
      _command.Dispose(); 
     } 
    } 

Выше приведен пример кода, который имеет общий заголовок исключения, но когда я запускаю эту программу, он будет случайным образом разбивать и обрабатывать и обрабатывать исключение в журнале приложений с помощью .net runtime ошибка null ссылка исключение.Ошибка необработанного времени выполнения C#

Немного фона ... это консольное приложение, которое автоматически запускается в полночь на сервере приложений. Он выполняет хранимые процедуры в другом блоке SQL Server 2008. Мы использовали эти ошибки, когда соединения были удалены сервером sql при выполнении задачи mainenace, это уже не так. Мне нужно получить небольшую ошибку. Я не понимаю, почему он обходит предложение catch и просто бросает необработанное исключение во время выполнения. Что это значит? Это происходит в любом количестве точек кода, а не только в этом. это всего лишь пример последнего, который взорвался

+1

Что ловят исключения, которые вы бросаете? –

+0

не могли бы вы выставить stacktrace необработанного исключения, но, глядя на ваш код, я думаю, что исключение NullReferenceException, вероятно, происходит от одного из читателей [****]. ToString() Statement – makim

+0

Вы ловите исключение и бросаете другое. Можете ли вы разместить полное сообщение об ошибке плюс трассировку стека? –

ответ

2

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

Однако, принимая дикое предположение, мое предложение о происхождении исключения NullRef заключается в том, где вы это делаете: e.InnerException.Message.

Свойство InnerException может быть нулевым, и это приведет к исключению NullRef. Это, однако, не является реальным исключением. Реальное исключение, из-за которого программа заканчивается обработчиком исключений, скрыта из-за вышеупомянутой ошибки.

Если вы хотите включить сообщение из InnerException, сначала проверьте, является ли оно нулевым или нет.

EDIT:

Делать это:

catch (Exception e) 
{ 
    throw new Exception(e.InnerException.Message + e.InnerException.StackTrace); 
} 

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

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

catch (Exception e) 
{ 
    throw new Exception("I have a good reason for interrupting the flow", e); 
} 

Обратите внимание, что экземпляр исключения передается в конструктор для исключения вызваны повторно. Это станет внутренним исключением.

О вашей стратегии исключения, это также довольно ненужными:

if (_connection.State == ConnectionState.Open) 
    reader = _command.ExecuteReader(CommandBehavior.CloseConnection); 
else 
    throw new Exception("Connection Closed"); 

ExecuteReader Метод уже бросает InvalidOperationException, если соединение закрыто, которое является более конкретным, чем ваш бросок Exception. Если вы собираетесь что-то предпринять, поймите более конкретное исключение позже. Теперь вы используете исключения как часть вашей логики программы, которая не является хорошей практикой.

+0

Я признаю вашу точку зрения, но она все еще бросает, когда я не отправляю внутреннее исключение. – rigamonk

+0

Спасибо за ваше терпение. Он вызывается методом main(), который завернут в try/catch. он работает, когда theres обычные ошибки, но те, которые происходят в полночь, всегда идут как необработанные. i dont unstand this – rigamonk

+0

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

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