2016-04-02 42 views
1

问题: 我相信我在编程这里缺少一些重点。我想创建一些代码路径不返回任何东西的方法。例如用于错误处理。如何故意有一个代码路径不返回一个int值在C#

例子: public static int calculateArea(int width, int length){ if(length < 0 || width < 0){ //don't want to return anything as negative distance is impossible //Execute my error handling here } else{ int area = length * width; return area; } }

问题:很简单,有没有办法覆盖的事实,你必须返回所有代码路径的值?

潜在解决方案我在网上看到过一个解决方案,其中错误处理代码路径返回一个特定值,因此您知道忽略它。但是,这似乎是一个非常不稳定的解 如果有更好的方法来编写这些类型的方法,我很乐意重构我的代码。

为什么这个问题是原创的:我觉得这个问题是原创的,因为我一直无法找到一个具体的答案在网上或在SO论坛。

+1

'的问题:很简单,有没有办法覆盖的事实,你必须在所有代码路径中返回一个值?'很简单** NO **,'我认为这个问题是原创的'不,你只需要阅读更多关于c#/。Net – Eser

+3

你可以抛出异常。 – juharr

+0

@juharr如果抛出一个异常,你不必返回一个值? –

回答

3

这里有两种语句,在C#中被认为的方法:returnthrow

在你的情况下,如果距离为负值应该抛出ArgumentExceptionArgumentOutOfRangeException

在另一方面,因为这是关于参数验证你应该看看code contracts

public static int CalculateArea(int width, int length) 
{ 
    Contract.Requires(length > -1 && width > -1, "Distance must be positive"); 

    int area = length * width; 

    return area; 
} 
+0

这实际上是一个很好的解决方案。 – mhenkel

+0

@mhenkel按合同设计是一种非常富有表现力且令人愉快的使用代码定义代码要求的方式! :) –

+0

@MatíasFidemraizer它似乎很酷,但得到一些奇怪的过程中的错误 –

2

如果您不想返回可用值,请使用空值Int代替:int?return null

+0

对我来说,这与返回-1或谁知道什么几乎相同。 –

+0

是的,这是真的,这不是一个好的解决方案,因为你将不得不重新检查该方法的结果再次... – mhenkel

1

你想要做的就是抛出异常。

Throw new Exception("Length and width cannot be negative."); 

只要你把你会看到你的编译器错误消失,因为函数没有返回的代码路径 - 它与异常退出。

您也可以使用您的异常类型更具体,可能使用ArgumentException

异常表示函数无法对给定参数进行操作,这是准确的。您不想返回null。如果你这样做,那么任何调用该函数的东西都必须检查该值是否为空。如果它是空的,那是什么意思?或者代码仍然会抛出异常,但现在这是一个令人费解的NullReferenceException。如果结果在被使用之前经过了一段时间,那么异常可能不在功能附近,这使得它更容易混淆。但是,如果在使用无效参数调用该函数时引发异常,那么可以更轻松地分辨出问题出在哪里。

+0

我觉得值得把一些真正的重点放在一个不好的主意,它是抛出'异常'实例而不是某种派生类型。你基本上是在告诉客户他们不能做任何事情(你怎么知道的?),或者他们必须捕捉所有可能的异常,包括那些与传递无效参数完全无关的异常。 – kai

0

您必须返回一个int ?,然后在该分支中返回null。否则,你可以有一个参考参数&如果长度或宽度为负

如果你绝对必须从这个方法&不想返回任何东西返回一个int不修改这个值,那么唯一的选择就是抛出未捕获的异常。 ArgumentOutOfRangeException将是一个不错的选择

+0

这似乎是迄今为止结构最好的答案。大多数人都有非常相似的方法,所以谢谢。我确实考虑过使用ref参数,但是我决定不这样做,因为我不想在执行方法时添加一个随机区域变量。 –

+0

我必须不同意。空值通常是有问题的 - 你必须检查空值的结果。如果您尝试获取高度或宽度无效的区域,则应该抛出异常。如果你调用一个函数来获得一个区域,并且结果是“null”,那么你对那个null做什么? –

1

你可以抛出一个异常,并直接将其接住或在代码中的其他点。这里有一个很简单的例子,我认为这是一个很好的例子

一些例子: https://msdn.microsoft.com/en-us/library/87cdya3t(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/ms173163.aspx

public static void randomCaller() 
{ 
    try { 
    int a = calculateArea(-1, 500); 
    } catch(NegativeDistanceNotPossibleException e) {} 
}   

public static int calculateArea(int width, int length){ 
      if(length < 0 || width < 0){ 
      //don't want to return anything as negative distance is impossible 
      //Execute my error handling here 
      throw new NegativeDistanceNotPossibleException("this is not possible"); 
      } 
      else{ 
      int area = length * width; 
      return area; 
      } 
     } 

public class NegativeDistanceNotPossibleException : Exception { 
    public NegativeDistanceNotPossibleException() {} 
    public NegativeDistanceNotPossibleException(string message) : base(message) {} 
    public NegativeDistanceNotPossibleException(string message, Exception inner) : base(message, inner) {} 
} 
0

如果你没有想抛出异常,最好的办法返回某个类或stucture,显示操作的结果。例如:

public class OperationResult 
{ 
    public bool Success {get;set} 
    public string ErrorMessage {get;set} 
    public int Result {get;set} //use it if success true 
}  

,这样你们可以处理错误的文字和事实,有些错误发生,否则,你可以使用操作结果

+0

一个类需要比int更多的内存分配,现在让我们考虑一下编写一个程序,该程序有数百万个存储类而不是整数。我总是试图编写面向性能和干净的代码。所以抛出异常在我看来更好。 (你甚至可以在你的应用程序的一个地方很容易地记录异常,甚至不必使用try,赶上它的工作并保持你的程序运行。) – mhenkel

+0

@mhenkel,如果你想获得更好的性能,使用汇编程序或C++ ,C#用于商务应用程序,需要支持和干净的代码。我的代码逻辑更适合支持其他程序员,所以我的代码比你更清洁。抛出异常也是困难的性能操作,比为堆中的某些字节分配返回值更困难。如果你能避免抛出异常,避免它。我更喜欢在未处理的场景中使用异常,而不是业务逻辑。总结:错误执行流程取决于应用程序种类。 – MelnikovI

相关问题