блоки try-catch с типом возврата

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

12
задан Daniel LeCheminant 2 March 2009 в 15:21
поделиться

10 ответов

Сохраните свое возвращаемое значение во временной переменной как это:

public DataTable ReturnSomething()
{
    DataTable returnValue = null;

    try
    {
        //logic here
        returnValue = ds.Tables[0]; 
    }
    catch (Exception e)
    {
        ErrorString=e.Message;
    }

    return returnValue;
}
32
ответ дан 2 December 2019 в 02:52
поделиться

Необходимо повысить/бросить исключение в блоке выгоды и обработать его в вызывающем методе.

public void invokeFaultyCode()
{
    try
    {
        DataTable dt = ReturnSomething();
    }
    catch(Exception e)
    {
        // Print the error message, cleanup, whatever
    }    
}
public DataTable ReturnSomething() throws Exception
{
   try
   {  
      //logic here
     return ds.Tables[0];
   }
   catch (Exception e)
   {
      ErrorString=e.Message;
      throw;
   }
}

PS: Извините за любую синтаксическую ошибку я немного ржав на C#.

17
ответ дан 2 December 2019 в 02:52
поделиться

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

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

Для моего примера это было бы кодировано следующим образом...

private void DoSomething() {
    try {
        DataTable dt = ReturnSomething();
    }
    catch (Exception ex) {
    }    
}

public DataTable ReturnSomething() {
    DataTable dt = new DataTable();

    // logic here
    return dt;
}
7
ответ дан 2 December 2019 в 02:52
поделиться

Если Вы собираетесь направиться, "не бросают маршрут исключения" (который я не обязательно reccomending), Вы могли следовать, TryParse обращаются к использованию MS.

Что-то как:

private string FillDataTable(out DataTable results)
{

  try
{
  results = new DataTable(); //something like this;
  return String.Empty;
}
catch (Exception ex)
{
  results = null;
 return ex.Message;

}

}

4
ответ дан 2 December 2019 в 02:52
поделиться

Переменная ErrorString подозрительно походит на переменную кода ошибки. Методические рекомендации состоят в том, чтобы использовать исключения, чтобы передать информацию об ошибке непосредственно, в случае необходимости, вместо того, чтобы хранить вещи прочь в коды ошибок.

Вы эффективно делаете то же самое со своим ErrorString, как Вы были бы то, если Вы просто позволяете исключению быть пойманным вызывающей стороной: удаление ответственности ответа на ошибку из самого метода. Это - хорошая цель иметь. Но использование строки ошибки не получает Вас ничто по использованию исключения. На самом деле Вы теряете информацию этот путь. Существует любое количество типов ошибок, которые могли произойти, и многим связали специальные исключения с ними с их собственными специальными свойствами для содержания контекстной информации об отказе. Просто храня от сообщения в Строке, Вы теряете эту информацию.

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

Другая вещь рассмотреть состоит в том, является ли это действительно ошибочным сценарием. Если это, очень маловероятно, что Ваш вызывающий метод собирается заботиться вообще, каково возвращаемое значение. В этом случае у Вас нет ничего для волнения о, просто позволив исключению пойти и не возврат чего-либо. Если это - Едва ли ошибочный сценарий, и вызывающая сторона просто собирается продвинуться и сделать что-то еще, ну, в общем, что это для вызывающей стороны, чтобы решить, исправиться? Все еще нет большого преимущества для получения путем возврата строки ошибки и фиктивного DataTable или пустого указателя по выдаче исключения со всей его контекстной информацией об отказе.

6
ответ дан 2 December 2019 в 02:52
поделиться

я предположил бы, что можно все еще установить сообщение, затем возвратить пустой указатель или независимо от того, что c# эквивалент

public DataTable ReturnSomething(){ 
   try {
        //logic here 
        return ds.Tables[0]; 
   } catch (Exception e) {
        ErrorString=e.Message;
        return null;
   }
}
3
ответ дан 2 December 2019 в 02:52
поделиться

Это зависит от Вас приложение. Можно возвратиться null, пустое DataTable или независимо от того, что подходит при обстоятельствах.

3
ответ дан 2 December 2019 в 02:52
поделиться

Как насчет этого:

public DataTable ReturnSomething(out string errorString)
{
   errorString = string.Empty;
   DataTable dt = new DataTable();
   try
   {  
      //logic here
     dt = ds.Tables[0];
   }
   catch (Exception e)
   {
      errorString = e.Message;
   }
   return dt;
}
2
ответ дан 2 December 2019 в 02:52
поделиться

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

Если необходимо поймать исключение там и сделать что-то, что это - весь штраф, но если это - все еще ошибочный случай, необходимо также бросить его, или другое исключение, возможно, с тем, которое Вы просто поймали как InnerException.

1
ответ дан 2 December 2019 в 02:52
поделиться

Я думаю, что Ваш код выполняется на достаточно высоком уровне стека вызовов, и он смешивается с кодом UI. Если это действительно имеет место, Вы могли return null в блоке выгоды. Однако при написании повторно используемого кода необходимо осуществить рефакторинг его так, чтобы он не содержал управление UI и обработал исключение в более высоком уровне в стеке вызовов.

0
ответ дан 2 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: