gpt4 book ai didi

异常处理 : Contract vs Exceptional approach

转载 作者:行者123 更新时间:2023-12-04 01:08:50 25 4
gpt4 key购买 nike

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

  • 契约(Contract)方式。
    当一个方法没有按照它在方法头中所说的去做时,它会抛出一个异常。因此该方法“ promise ”它将执行操作,如果由于某种原因失败,它将抛出异常。
  • 特殊的方法。
    只有在发生真正奇怪的事情时才抛出异常。当您可以使用正常控制流(If 语句)解决这种情况时,您不应使用异常。您不会像在契约方法中那样使用 Exceptions 进行控制流。

  • 让我们在不同的情况下使用这两种方法:
    我们有一个 Customer 类,它有一个名为 OrderProduct 的方法。
    契约(Contract)方式:
    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
    在这里,我更喜欢特殊的方法,因为如果客户没有赢得彩票而没有钱,这并不是真正的特殊。
    但这是我在契约(Contract)风格上犯错的情况。
    非凡:
    class CarController
    {
    // returns null if car creation failed.
    public Car CreateCar(string model)
    {
    // something went wrong, wrong model
    return null;
    }
    }
    当我调用一个名为 CreateCar 的方法时,我非常期待一个 Car 实例而不是一些糟糕的空指针,它会在十几行之后破坏我正在运行的代码。因此,我更喜欢契约(Contract)而不是这个:
    class CarController
    {

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

    return new Car();
    }
    }
    你使用哪种风格?您认为处理异常的最佳通用方法是什么?

    最佳答案

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

    关于异常处理 : Contract vs Exceptional approach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26383/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com