我知道异常处理的两种方法,让我们看看它们。
合同方式。
当一个方法没有按照它在方法头中所说的去做时,它会抛出一个异常。因此,该方法“承诺”它将执行该操作,如果由于某种原因失败,它将抛出异常。
非凡的方法。
只有当真正奇怪的事情发生时才抛出异常。当您可以使用正常的控制流(If 语句)解决问题时,您不应该使用异常。您不会像在合同方法中那样将异常用于控制流。
让我们在不同的情况下使用这两种方法:
我们有一个 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();
}
}
你使用哪种风格?您认为异常的最佳通用方法是什么?