如何显示该方法成功返回或失败而未在C#中返回值?

问题描述 投票:1回答:9

[我知道在其他语言中,例如C / C ++,您将返回类似SUCCESS的值,该值将向调用方法指示该方法成功返回或失败。

在C#中是否有一种“不错”的方法无需SUCCESS返回变量?我想到了一个例外,但是我不确定该如何实现。您是否可以通过自己的错误消息抛出自定义异常?

示例代码将不胜感激。

先谢谢您。

c# exception-handling syntactic-sugar
9个回答
1
投票

您可以从Exception派生自己的异常。

您可以返回布尔值或某些数字约定。

在C#中,如果要返回成功/失败,而且要返回产品输出,则输出参数比指针要容易使用一点。

我倾向于例外情况的例外。逻辑事物的逻辑返回。即不要使用异常来控制程序操作。如果文件操作意外失败,则引发异常。如果应用程序需要查找文件,并且通常希望有时找不到它作为正常操作,则我不希望调用方捕获异常,而是简单地返回布尔值并选择通过应用程序的适当逻辑路径。


4
投票

1)我不建议使用异常,除非失败是“异常”。例如,它失败了,这意味着需要处理一些事情。它们比“ false”类型返回慢。

2)为什么要避免返回值?您必须没有返回值吗?


2
投票

您是否在引用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" );
}

2
投票

如果您的方法是void,则它返回而没有引发异常的事实被认为是成功。

如果您的方法不是void,则特定的返回值可能会解释为不成功的执行,例如:

  • [bool方法返回false
  • 返回null的任何引用类型返回方法

2
投票

请勿将异常用于流控制或“成功”的指示。

如果您除了返回参数之外还希望获得成功或失败的指示器,则可以在方法签名中使用out bool参数。

public SomeObject DoingSomethingHere(out bool success)
{


}
if (!success)
{
    // some compensating action
}

1
投票

听起来您想表明一个方法如果不使用返回值或异常就无法成功完成。 [out bool参数呢?

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

我会建议您这样做,但由于您询问...。


1
投票

对于某些类型的故障,自定义异常无疑是一个好方法。一种简单的方法是在一个公共库中创建一个DomainException类(或您想要为应用程序的问题域调用的任何类,等等),该类库继承自Exception并添加您认为将是的任何特定信息。对于自定义域异常很有用。 (也许是特定的代码,也许是有关当前环境的信息,这些信息可能在标准Exception等中不可用,等等)


1
投票

不抛出异常将是我想到的方式...


0
投票

您可以返回状态变量,例如枚举,整数或布尔值。问题在于调用者必须知道不同的返回值意味着什么。有时为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);
}
© www.soinside.com 2019 - 2024. All rights reserved.