当前位置:  开发笔记 > 编程语言 > 正文

异常处理:合同与特殊方法

如何解决《异常处理:合同与特殊方法》经验,为你挑选了1个好方法。

我知道两种异常处理方法,让我们来看看它们.

    合同方式.

    如果方法没有按照它在方法头中所做的那样做,它将抛出异常.因此,该方法"承诺"它将执行操作,如果由于某种原因失败,它将抛出异常.

    特殊的方法.

    只有在发生真正奇怪的事情时抛出异常.当您可以使用正常控制流(If语句)解决情况时,不应使用异常.您不会像在合同方法中那样使用Exceptions作为控制流.

让我们在不同的情况下使用这两种方法:

我们有一个Customer类,它有一个名为OrderProduct的方法.

合同方式:

class Customer
{
     public void OrderProduct(Product product)
     {
           if((m_credit - product.Price) < 0)
                  throw new NoCreditException("Not enough credit!");
           // do stuff 
     }
}

特殊方法:

class Customer
{
     public bool OrderProduct(Product product)
     {
          if((m_credit - product.Price) < 0)
                   return false;
          // do stuff
          return true;
     }
}

if !(customer.OrderProduct(product))
            Console.WriteLine("Not enough credit!");
else
   // go on with your life

在这里,我更喜欢这种特殊的方法,因为假设他没有赢得彩票,客户没有钱也不是真正的例外.

但这是一种我在合同风格上犯错的情况.

卓越:

class CarController
{
     // returns null if car creation failed.
     public Car CreateCar(string model)
     {
         // something went wrong, wrong model
         return null;
     }
 }

当我调用一个名为CreateCar的方法时,我该死的期待一个Car实例而不是一些糟糕的空指针,这可能会破坏我的运行代码十几行.因此,我更喜欢与此合同:

class CarController
{

     public Car CreateCar(string model)
     {
         // something went wrong, wrong model
         throw new CarModelNotKnownException("Model unkown");

         return new Car();
     }
 }

你用哪种风格?您认为对例外的最佳一般方法是什么?



1> Kristopher J..:

我赞成你称之为"合同"的方法.在支持异常的语言中,不需要返回空值或其他特殊值来指示错误.我发现当代码没有一堆"if(result == NULL)"或"if(result == -1)"子句与可能非常简单,直接的逻辑混合时,会更容易理解代码.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有