我正在编写一个方法,确保调用者有权执行它。当用户未获得授权时,我必须抛出异常(请参阅下面的代码)。该方法的名称应该是什么?
public void Compute() {
this.CheckIfCallerAuthorizedOrThrow(); // Is it a good name? Better idea?
// ...
}
我想确保读取代码的人理解该方法的流程可以通过异常来解决。在这种情况下,使用带有“throw”的方法名称是好事还是坏事?
答案 0 :(得分:7)
老实说,方法名称应该准确描述它应该做什么。所以在某种程度上,这是一个好名字。但是,一个例外是说“这种方法无法成功完成,这就是为什么......”。几乎每个你编写的方法都会引发异常,因此在每个方法的名称中记录异常是没有意义的。
您应该考虑使用XML文档。 XML文档也更具体。它告诉抛出什么类型的异常,以及它将被抛出的具体原因。
我确实使用带有“throw”的方法名称,但它们通常是我在其他几个公共方法中重用的非常短的私有方法。他们通常看起来像这样:
private void doSomethingOrThrow(object args)
{
if (args == null)
throw new ArgumentNullException();
doSomething();
}
因此,简而言之,这可能是一个很好的方法名称。我不会在每个抛出异常的方法中使用“throw”。此外,一个优秀的开发人员无论如何都需要查看文档以查看抛出了什么样的异常(我当然希望他不仅仅是一直在捕获通用的异常......)
答案 1 :(得分:4)
不,它开始以这种方式看待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.");
}
答案 2 :(得分:2)
任何方法都可以抛出异常,因此添加OrThrow / Throws不一定能提供足够的值来使名称更长。
尝试在名称中使用assert / ensure / verify而不是“check”(感觉它应该为true / false)。即看看“EnsureCallerAuthorized”之后的下一行是否仅由授权用户执行,这对你来说是否合理。
答案 3 :(得分:1)
这显然是个人品味问题,但更常见的习惯是“断言”家庭,如assertCallerIsAuthorized()
。
答案 4 :(得分:0)
从我读到的这个方法无法执行的事实并不例外。在整个程序执行过程中经常会发生这种情况。如果这个假设是正确的,我建议不要实际使用异常来控制程序流程。