认为有意义的地方,我们应该总是使用内置的例外而不是定义我们自己的例外,即:
IllegalArgumentException
- 在方法传递无效参数时抛出,即不允许为null IllegalStateException
- 在不允许调用方法时抛出(即必须先调用setup()
。由于用户试图读取或写入他们无权操作的资源而导致异常时抛出(如果有)的最佳异常类型是什么。您会建议使用SecurityException
或AccessControlException
,还是听起来不合情理。
答案 0 :(得分:4)
来自http://docs.oracle.com/javase/7/docs/api/java/security/AccessControlException.html:
AccessController抛出此异常,表示拒绝所请求的访问(对文件系统或网络等关键系统资源)。
拒绝访问的原因可能有所不同。例如,根据安全策略,请求的权限可能是不正确的类型,包含无效值或请求访问权限。在抛出异常时,应尽可能提供此类信息。
听起来非常接近你所描述的情景。我会选择AccessControlException
。
请注意,甚至还有一个带Permission
对象的构造函数。
答案 1 :(得分:3)
在我看来,他们都不是。每个异常类都有一个目的,在这种情况下SecurityException
是SecurityManager(它是JRE的一部分)抛出的异常类,而AccessControlException
是SecurityException
的子类型{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
,则不清楚其含义。