Java:我们通常不希望向用户显示错误堆栈跟踪中的哪些信息?

Java:我们通常不希望向用户显示错误堆栈跟踪中的哪些信息?,第1张

Java:我们通常不希望向用户显示错误堆栈跟踪中的哪些信息?

您不应该向用户展示任何这种愚蠢的东西。对于大多数人来说这毫无意义,也无济于事。如您所怀疑,它还暴露了实施的内部结构,这些内部结构可能暗示恶意用户可能使用的漏洞。

相反,您应该捕获异常,将其记录下来,并向用户显示更易理解的错误消息。您可以

getMessage()
用来提取异常的消息部分。如果该异常没有消息,则显示诸如“没有可用的详细信息”之类的内容。

更新:

根据问题更新,我有一些评论。首先,我将使用户与系统的任何内部组件完全隔离,这既对用户友好,又出于安全考虑。(例如,即使知道您正在使用java.sql程序包,也可能向聪明的黑客暗示漏洞。)因此,在向用户显示任何内容时,请不要使用异常消息,堆栈跟踪的第一行或类似内容。

其次,您应该将所有错误从异常级别(在代码中遇到的错误)映射到用户正确抽象级别的消息。正确的方法取决于系统的内部以及引发异常时用户可能试图执行的 *** 作。这可能意味着将您的系统分为多个层,以便每个捕获到异常的层都将其转换为更高抽象层的异常。Java异常可以包装其他异常(原因)。例如:

public boolean copyFile(File source, File destination) throws CopyException {    try {        // lots of pre        return true;    } catch (IOException e) {        throw new CopyException("File copy failed", e);    }}

然后可以在User类的更高级别使用它:

public boolean shareFile(File source, User otherUser) throws ShareException {    if (otherUser.hasBlocked(this) {        throw new ShareException("You cannot share with that user.");    }    try {        return copyFile(source, otherUser.getSharedFileDestination(source));    } catch (CopyException e) {        throw new ShareException("Sharing failed due to an internal error", e);    }}

(我希望很明显,以上代码旨在说明将异常转换为更高抽象级别的想法,而不是建议您在系统中使用的代码。)

您想要处理这样的事情(而不是通过某种方式来处理消息和/或堆栈跟踪)的原因是,异常(例如,带有消息“权限被拒绝”的IOException)可能对用户(以及您的系统)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5489343.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存