gpt4 book ai didi

tomcat - 在 Jetty/Tomcat 中处理异常的不同方式

转载 作者:行者123 更新时间:2023-11-28 22:31:56 24 4
gpt4 key购买 nike

问题的简短版本:什么会导致 Scalatra/(Jetty 或 Tomcat)在不设置请求属性“javax.servlet.error.exception”的情况下将执行传递给 ErrorHandler 的 handle

具有更多上下文的更长的一个:在我最近加入的一个项目中,ErrorHandlers 的 handle 方法具有单独的 block ,用于处理来自“javax.servlet.error.exception”请求属性的异常和所有其他异常。我们在 Jetty 中运行我们的应用程序,据我了解 Jetty 解包 ServletExceptions 并将它们放在上面的属性中。那么什么会导致处理非“javax.servlet.error.exception”异常的 block 被调用?或者它是多余的并且可以删除?

最初编写代码的人离开了项目。其余的技术堆栈是 Scala 和 Scalatra,如果它有什么不同的话。

  Option(request.getAttribute("javax.servlet.error.exception"))
.map {
exception => exception match {
//various exceptions handled
}.getOrElse(handleStatusCode(currentStatus))

编辑:似乎在某些环境中,代码在 Tomcat 上运行。

最佳答案

此代码块中发生了几个方法调用,相当于以下内容:

val a = request.getAttribute("javax.servlet.error.exception")
val b = Option(a)
val c = b.map { exception => /* various exceptions handled... */ }
val d = c.getOrElse(handleStatusCode(currentStatus))

因此,a 只是一个普通的 Java 调用。它将在请求中查找指定的属性,并返回映射到该属性的 Objectnull

对于 b,我们调用 Option 构造函数将之前的结果包装在一个 Option 中(这比处理 null 更像 Scala 风格)。所以如果 anull 那么 b 将是 None,否则它将是 Some 实例包含 a 的(非空)值。

在下一行,这个选项被映射到一个新值。如果 bNone(即 anull),则 c 也将为。否则,大括号内的逻辑将应用于 b 中包含的值,并且返回的结果包含在 Some 中。

最后,Option 被解包。如果 c 包含一些值,那么这个值本身就是整个 block 的结果。否则,cNone,则对handleStatusCode(currentStatus) 求值,其结果为整个 block 的结果。


因此,我们可以说当且仅当cNone => b 时才会调用handleStatusCode > 是 None => anull => 请求没有属性映射到 “javax.servlet.error.exception”

通常应该是这种情况(例如,在每个非错误请求上)。因此,如果此 block 出现在检查中,则删除代码才是安全的,例如:

if (request.getAttribute("javax.servlet.error.exception") != null) {
...
// your posted code
}

即使你要删除它,你会用什么来代替它?当 Option 为空时,结果应该是什么?由于这个原因,在 Option 上调用 get() 通常不是一个好主意;如果您知道它永远不会为空,则不需要按照上面的 b 行将其包装。

关于tomcat - 在 Jetty/Tomcat 中处理异常的不同方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12603999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com