Function 只对条件抛出异常的方法的设计模式名称?

Function 只对条件抛出异常的方法的设计模式名称?,function,exception,design-patterns,methods,Function,Exception,Design Patterns,Methods,我遇到过这样的代码,其中的函数除了检查条件并抛出异常之外什么都不做,或者什么都不做,这取决于条件的求值结果 代码如下所示: 公共字符串MyMethod(){ var name=“foo”; 确保成功(姓名); 返回名称; } //如果名称不是“bar”,则引发异常 public void EnsureSuccess(字符串名称){ 如果(名称!=“bar”) { 抛出新的ArgumentException(“非bar!”); } } 这叫什么?这是命名的设计模式吗 这被认为是一个好的做法还是一

我遇到过这样的代码,其中的函数除了检查条件并抛出异常之外什么都不做,或者什么都不做,这取决于条件的求值结果

代码如下所示:

公共字符串MyMethod(){
var name=“foo”;
确保成功(姓名);
返回名称;
}
//如果名称不是“bar”,则引发异常
public void EnsureSuccess(字符串名称){
如果(名称!=“bar”)
{
抛出新的ArgumentException(“非bar!”);
}
}
这叫什么?这是命名的设计模式吗

这被认为是一个好的做法还是一个坏的做法


使用此功能的野生代码示例是Microsoft提供的
HttpResponseMessage.cs
中的
ensureccessstatuscode
方法,它是
System.Net.Http
的一部分。(,)

这不是一种设计模式。它叫

在计算机编程中,断言是一个谓词(真-假) 语句)放在程序中表示开发人员认为 谓词在那个地方总是真的。如果一个断言 在运行时计算为false,将导致断言失败 通常会导致执行中止


这不是一种设计模式。它叫

在计算机编程中,断言是一个谓词(真-假) 语句)放在程序中表示开发人员认为 谓词在那个地方总是真的。如果一个断言 在运行时计算为false,将导致断言失败 通常会导致执行中止


除了@Chris Eelmaa的答案之外,我还要说,这也使用了这个原则。似乎经常使用
EnsureSuccess(字符串名)
。否则,我看不出提取两行代码的意义

示例中另一件有趣的事情与您指出的不同

throw new Exception("Not bar!");
但是根据-不要抛出新异常()

所以请注意,应该是

throw new SpecificException("Not bar!");
Exception是一个太宽泛的类,如果没有副作用,很难抓住它。派生您自己的异常类,但从异常派生它。通过这种方式,您可以为框架引发的异常设置专门的异常处理程序,为您自己引发的异常设置另一个异常处理程序

在代码示例中,它们是:

throw new ArgumentOutOfRangeException ();
throw new ArgumentNullException ("......");
throw new HttpRequestException (string.Format ("{0} ({1})", (int) statusCode, ReasonPhrase)); 

除了@Chris Eelmaa的答案之外,我还要说,这也使用了这个原则。似乎经常使用
EnsureSuccess(字符串名)
。否则,我看不出提取两行代码的意义

示例中另一件有趣的事情与您指出的不同

throw new Exception("Not bar!");
但是根据-不要抛出新异常()

所以请注意,应该是

throw new SpecificException("Not bar!");
Exception是一个太宽泛的类,如果没有副作用,很难抓住它。派生您自己的异常类,但从异常派生它。通过这种方式,您可以为框架引发的异常设置专门的异常处理程序,为您自己引发的异常设置另一个异常处理程序

在代码示例中,它们是:

throw new ArgumentOutOfRangeException ();
throw new ArgumentNullException ("......");
throw new HttpRequestException (string.Format ("{0} ({1})", (int) statusCode, ReasonPhrase)); 

想象一下,
EnsureSuccess
的代码在
MyMethod
上是串联的:

公共字符串MyMethod(){
var name=“foo”;
//确保成功
如果(名称!=“bar”)
{
抛出新的ArgumentException(“非bar!”);
}
返回名称;
}
首先,它需要一条评论来解释它在做什么。其次,作为一个例子,您需要在每个需要检查此条件的地方重复此代码

有一种重构(类似于编码模式)称为,它会产生您在这里看到的结果


Extract方法(在本例中为“不要重复自己”)也是的一个示例,因为
EnsureSuccess
的详细信息隐藏在该方法中。如果决定更改
EnsureSuccess
的工作逻辑,只需更改单个方法,调用该方法的任何地方都不需要更改。

想象一下
EnsureSuccess
的代码在
MyMethod
上是串联的:

公共字符串MyMethod(){
var name=“foo”;
//确保成功
如果(名称!=“bar”)
{
抛出新的ArgumentException(“非bar!”);
}
返回名称;
}
首先,它需要一条评论来解释它在做什么。其次,作为一个例子,您需要在每个需要检查此条件的地方重复此代码

有一种重构(类似于编码模式)称为,它会产生您在这里看到的结果


Extract方法(在本例中为“不要重复自己”)也是的一个示例,因为
EnsureSuccess
的详细信息隐藏在该方法中。如果决定更改
EnsureSuccess
的工作逻辑,只需更改单个方法,调用该方法的任何地方都不需要更改。

可能是Visitor,您可以将函数放在类中。 因此,可能该类EnsureSuccess将充当某种验证器。 也许这个类的作业要执行所有异常处理

它也可以是外观模式。 此模式通常用作验证器


谢谢,

可能是Visitor,您将函数放在一个类中。 因此,可能该类EnsureSuccess将充当某种验证器。 也许这个类的作业要执行所有异常处理

它也可以是外观模式。 此模式通常用作验证器


谢谢,

关于1.0/1.1时代(IIRC)日期的特别建议。现在,它指出:“您应该从类而不是ApplicationException类派生自定义异常。您不应该在代码中引发ApplicationException异常,也不应该捕捉ApplicationException异常,除非您打算重新引发原始异常。”我知道不捕捉常规异常,但由于这只是一个例子,我没有使用