问题描述
|
我正在编写一种方法,以确保调用者有权执行该方法。如果用户未获得授权,则必须抛出异常(请参见下面的代码)。该方法的名称应该是什么?
public void Compute() {
this.CheckIfCallerAuthorizedOrThrow(); // Is it a good name? Better idea?
// ...
}
我想确保读取代码的人理解该方法的流程可以在此处被异常破坏。在这种情况下,使用带有“ throw”的方法名称是一种好习惯还是坏习惯?
解决方法
老实说,方法名称应准确描述其应做的事情。因此,在某种程度上,这是一个好名字。但是,有一种例外方式是说“此方法无法成功完成,这就是为什么...”。您编写的几乎每个方法都可能引发异常,因此以每个方法的名称记录异常是没有意义的。
您应该考虑使用XML文档。 XML文档也更加具体。它告诉您将抛出哪种类型的异常,以及抛出异常的具体原因。
我实际上使用的方法名称中带有“ throw”,但是它们通常是我在其他几种公共方法中重用的简短私有方法。它们通常如下所示:
private void doSomethingOrThrow(object args)
{
if (args == null)
throw new ArgumentNullException();
doSomething();
}
简而言之,这可能是一个好的方法名称。我只是不会在引发异常的每个方法中都使用\“ throw \”。此外,优秀的开发人员无论如何都需要查看文档以查看抛出了什么样的异常(我当然希望他不只是一直在捕获通用的异常...)
,不,它开始以这种方式查看Java \的检查异常。而是使用XML文档来记录所有引发的异常。例如:
/// <summary>
/// Checks to see if the caller is authorized to access the resource.
/// </summary>
/// <exception cref=\"ArgumentException\">
/// Throws invalid argument exception when an invalid parameter is supplied.
/// </exception>
CheckIfCallerAuthorized(sring myArgument)
{
throw new ArgumentException(\"Invalid argument was provided for myArgument.\");
}
,任何方法都可以引发异常,因此添加OrThrow / Throws不必提供足够的值来延长名称。
尝试在名称中使用assert / ensure / verify而不是\“ check \”(感觉应该为true / false)。即看看是否对您来说\ EnsureCallerAuthorized \之后的下一行将仅由授权用户执行。
,这显然是个人喜好问题,但更常见的习惯用法是“断言”家庭中的某词,例如assertCallerIsAuthorized()
。
,从我的理解中,这种方法无法执行的事实并不罕见。它可能在程序执行的整个过程中频繁发生。如果这个假设是正确的,我建议不要实际使用异常来控制程序流程。