Если ваш компилятор достаточно умен, он может оптимизировать этот случай с помощью как-будто правила . Таким образом, компилятор C ++ может оптимизировать многие вещи. Но это также не может. Единственный способ быть абсолютно уверенным - это проверить код, сгенерированный вашим конкретным компилятором. При этом вряд ли это станет узким местом в вашей программе. Так что делайте, какая версия будет более читабельной.
Сохраните свое возвращаемое значение во временной переменной как это:
public DataTable ReturnSomething()
{
DataTable returnValue = null;
try
{
//logic here
returnValue = ds.Tables[0];
}
catch (Exception e)
{
ErrorString=e.Message;
}
return returnValue;
}
Необходимо повысить/бросить исключение в блоке выгоды и обработать его в вызывающем методе.
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#.
Необходимо перенести вызывающую сторону с выгодой попытки... любые исключения, которые происходят в стандартной программе, которую называют, будет пузыриться вызывающей стороне, и можно поймать их там.
Лично, я думаю, что это - излишество, чтобы иметь выгоду попытки в этой стандартной программе, поскольку у Вас должна быть вызывающая сторона, обрабатывающая исключение.
Для моего примера это было бы кодировано следующим образом...
private void DoSomething() {
try {
DataTable dt = ReturnSomething();
}
catch (Exception ex) {
}
}
public DataTable ReturnSomething() {
DataTable dt = new DataTable();
// logic here
return dt;
}
Если Вы собираетесь направиться, "не бросают маршрут исключения" (который я не обязательно 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;
}
}
Переменная ErrorString подозрительно походит на переменную кода ошибки. Методические рекомендации состоят в том, чтобы использовать исключения, чтобы передать информацию об ошибке непосредственно, в случае необходимости, вместо того, чтобы хранить вещи прочь в коды ошибок.
Вы эффективно делаете то же самое со своим ErrorString, как Вы были бы то, если Вы просто позволяете исключению быть пойманным вызывающей стороной: удаление ответственности ответа на ошибку из самого метода. Это - хорошая цель иметь. Но использование строки ошибки не получает Вас ничто по использованию исключения. На самом деле Вы теряете информацию этот путь. Существует любое количество типов ошибок, которые могли произойти, и многим связали специальные исключения с ними с их собственными специальными свойствами для содержания контекстной информации об отказе. Просто храня от сообщения в Строке, Вы теряете эту информацию.
Таким образом, если Ваша цель не состоит в том, чтобы конкретно скрыть тип ошибки, которая происходит от вызывающей стороны, можно только получить путем пропущения исключения.
Другая вещь рассмотреть состоит в том, является ли это действительно ошибочным сценарием. Если это, очень маловероятно, что Ваш вызывающий метод собирается заботиться вообще, каково возвращаемое значение. В этом случае у Вас нет ничего для волнения о, просто позволив исключению пойти и не возврат чего-либо. Если это - Едва ли ошибочный сценарий, и вызывающая сторона просто собирается продвинуться и сделать что-то еще, ну, в общем, что это для вызывающей стороны, чтобы решить, исправиться? Все еще нет большого преимущества для получения путем возврата строки ошибки и фиктивного DataTable или пустого указателя по выдаче исключения со всей его контекстной информацией об отказе.
я предположил бы, что можно все еще установить сообщение, затем возвратить пустой указатель или независимо от того, что c# эквивалент
public DataTable ReturnSomething(){
try {
//logic here
return ds.Tables[0];
} catch (Exception e) {
ErrorString=e.Message;
return null;
}
}
Это зависит от Вас приложение. Можно возвратиться null
, пустое DataTable
или независимо от того, что подходит при обстоятельствах.
Как насчет этого:
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;
}
Так как Вы - cacthing исключение (и не бросок его снова) в Вашем примере, внешний код предполагает, что все хорошо, и для этого необходимо возвратить что-то полезное.
Если необходимо поймать исключение там и сделать что-то, что это - весь штраф, но если это - все еще ошибочный случай, необходимо также бросить его, или другое исключение, возможно, с тем, которое Вы просто поймали как InnerException.
Я думаю, что Ваш код выполняется на достаточно высоком уровне стека вызовов, и он смешивается с кодом UI. Если это действительно имеет место, Вы могли return null
в блоке выгоды. Однако при написании повторно используемого кода необходимо осуществить рефакторинг его так, чтобы он не содержал управление UI и обработал исключение в более высоком уровне в стеке вызовов.