Как я могу показать, что метод возвращен успешно или не удалось, не возвращая значение в C #? - PullRequest
1 голос
/ 31 марта 2011

Я знаю, что в других языках, таких как C / C ++, вы бы возвращали значение, такое как SUCCESS, которое указывало бы вызывающему методу, что метод возвратил успешный или неудачный.это в C # без необходимости возвращаемой переменной SUCCESS?На ум приходит выбрасывание исключения, но я не уверен, как это можно реализовать.Есть ли пользовательское исключение, которое вы можете выдать с собственным сообщением об ошибке?

Пример кода будет принят с благодарностью.

Заранее спасибо.

Ответы [ 9 ]

4 голосов
/ 31 марта 2011

1) Я бы не рекомендовал использовать исключение, если ошибка не была «исключительной». Например, это не удалось, и это означает что-то, что должно быть обработано. Они медленнее, чем возврат «ложного» типа.

2) Почему вы пытаетесь избежать возвращаемого значения? У вас не должно быть возвращаемых значений?

2 голосов
/ 31 марта 2011

Не используйте исключения для управления потоком или для указания «успеха».

Если вы хотите иметь индикатор успеха или неудачи в дополнение к возвращаемому параметру, вы можете использовать параметр out bool в сигнатуре вашего метода.

public SomeObject DoingSomethingHere(out bool success)
{


}
if (!success)
{
    // some compensating action
}
2 голосов
/ 31 марта 2011

Если ваш метод void, то тот факт, что он возвратился без выдачи исключения, считается УСПЕХОМ.

Если ваш метод отличается от void, то определенные возвращаемые значения могут интерпретироваться как неудачные выполнения, например:

  • bool метод возврата false
  • любой метод возврата ссылочного типа, возвращающий null
2 голосов
/ 31 марта 2011

Вы используете тип данных bool?

Пример определения функции:

public static bool DoSomething()
{
    if ( some || condition )
        return true;
    else
        return false;
}

Пример использования:

public static void main()
{
    if ( DoSomething() )
        Console.WriteLine( "SUCCESS" );
    else
        Console.WriteLine( "FAILURE" );
}
1 голос
/ 31 марта 2011

Вы можете получить свои собственные исключения из Exception.

Вы можете вернуть bool или какое-либо числовое соглашение.

В C # у вас есть выходные параметры, которые немного проще использовать, чем указателиесли вы хотите вернуть успех / неудачу, но также и вывод продукта.

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

1 голос
/ 31 марта 2011

Для определенных типов сбоев пользовательское исключение, безусловно, хороший способ. Одним из простых подходов было бы создание класса DomainException (или как вы хотите называть его для проблемной области вашего приложения и т. Д.) В общей библиотеке, которая наследуется от Exception и добавляет любую конкретную информацию, которая, по вашему мнению, будет полезно для пользовательского исключения домена. (Может быть, конкретные коды, может быть информация о текущей среде, которая может быть недоступна в стандарте Exception и т. Д.)

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

1 голос
/ 31 марта 2011

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

В основном есть способы, которыми вы можете получить сообщение из функции

  • вернуть что-то
  • используйте переменную out
  • бросить исключение
  • установить переменную для другого члена класса

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

НТН

Mario

1 голос
/ 31 марта 2011

Похоже, вы хотите указать, что метод не завершился успешно без использования возвращаемого значения или исключения. А как насчет параметра out bool?

public void Execute(out bool success) {
      try {
          //...
          success = true;
      } catch {
          success = false
      }
}

Я бы не рекомендовал бы сделать это, но так как вы спросили ....

0 голосов
/ 31 марта 2011

Вы можете вернуть переменную состояния, такую ​​как перечисление, целое число или логическое значение.Проблема в том, что вызывающий должен знать, что означают различные возвращаемые значения.Иногда true означает, что это было успешно, иногда это означает, что произошла ошибка.Кроме того, непосредственный вызывающий может не знать, что делать в случае сбоя вызова, что требует сбоя «всплывающего» при сбое каждого метода из-за его вызова.

Try-throw-catch - шаблон перехода дляобработка вещей, о которых вы знаете, может потерпеть неудачу, и контроль потока выполнения, если / когда это произойдет:

public void MightFail()
{
   //obviously your code will do something a little more meaningful
   if(new Random().Next(2) == 0) throw new Exception("I failed");
   return;
}

public void RunRiskyMethod()
{
   var failures = 0;
   var successes = 0;
   var totalRuns = 0;

   for(var i=1;i<10000;i++)
   {
       try
       {
          MightFail();
          //if the previous line throws an exception, the below lines will not execute
          successes++;
          Console.WriteLine("Success!");
       }
       catch(Exception) //I didn't name the exception because we don't need its info.
       {
          //These lines ONLY execute if an exception was thrown from within the try block
          failures++;
          Console.WriteLine("Failure!");
       }
       finally
       {
          //this code ALWAYS executes, even if an exception is thrown and not caught
          totalRuns++;
       }
   }

   Console.WriteLine(String.Format("{0} Successes, {1} Failures.", successes, failures);
}
...