内置java异常类型用于权限异常

时间:2013-02-27 00:14:58

标签: java exception

认为有意义的地方,我们应该总是使用内置的例外而不是定义我们自己的例外,即:

  • IllegalArgumentException - 在方法传递无效参数时抛出,即不允许为null
  • IllegalStateException - 在不允许调用方法时抛出(即必须先调用setup()

由于用户试图读取或写入他们无权操作的资源而导致异常时抛出(如果有)的最佳异常类型是什么。您会建议使用SecurityExceptionAccessControlException,还是听起来不合情理。

5 个答案:

答案 0 :(得分:4)

来自http://docs.oracle.com/javase/7/docs/api/java/security/AccessControlException.html

  

AccessController抛出此异常,表示拒绝所请求的访问(对文件系统或网络等关键系统资源)。

     

拒绝访问的原因可能有所不同。例如,根据安全策略,请求的权限可能是不正确的类型,包含无效值或请求访问权限。在抛出异常时,应尽可能提供此类信息。

听起来非常接近你所描述的情景。我会选择AccessControlException

请注意,甚至还有一个带Permission对象的构造函数。

答案 1 :(得分:3)

在我看来,他们都不是。每个异常类都有一个目的,在这种情况下SecurityExceptionSecurityManager(它是JRE的一部分)抛出的异常类,而AccessControlExceptionSecurityException的子类型{1}}。

我认为当真正的原因是没有授予应用程序定义的权限时抛出SecurityException是不正确的(尽管名称很漂亮)(与{{1强制执行的权限相反) }})。

您应该考虑异常是由希望能够知道如何处理它们的代码捕获的。如果某些函数不知道如何“修复”异常,则应该允许异常使堆栈冒泡。处理SecurityManager的任何代码肯定不知道如何处理您的应用程序引发的异常。

答案 2 :(得分:2)

你应该总是使用内置异常。如果您要提供API,那么如果您的项目是“MyProject”,则更适合抛出您自己的自定义异常,例如MyProjectPermissionException。当然有很多情况下,如果用户传入一个明显不好的参数,最好抛出内置IllegalArgumentException

您也可以考虑列出实际原因,例如: SecurityException,在您的自定义异常中,如果这对您的来电者有帮助。

catch(SecurityException e)
{
    throw new MyProjectPermissionException("Permission denied", e);
}

答案 3 :(得分:0)

我实际上建议为此用例实现您自己的,可能已检查的异常。 AFAIK核心API没有任何适用于您描述的内容。

AccessDeniedException,但扩展了IOException,因此是一个经过检查的例外,与文件访问严格相关。

答案 4 :(得分:0)

对于已检查的异常,您最好使用新的异常类型。否则,如果有人抓到SecurityException,则不清楚其含义。