当前位置: 首页 > 知识库问答 >
问题:

在web应用程序中使用panics

左丘恩
2023-03-14
func Handler(body func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) {
    return func(responseWriter http.ResponseWriter, request *http.Request) {
        defer recoverIfPanic(responseWriter, request)
        body(responseWriter, request)
    }
}

func recoverIfPanic(responseWriter http.ResponseWriter, request *http.Request) {
    reason := recover()
    if reason == nil {
        return
    }
    // log and return http error
}

func PanicIf(err error, httpStatus int, description string) {
    if error != nil {
        panic(MyPanicStruct{err: err, httpStatus: httpStatus, description: description})
    }
}
result, err := SomeApi(...)
PanicIf(err, http.StatusInternalServerError, "SomeApi")

在99%的情况下,当SQL server返回意外错误或文件系统中缺少文件时,我不能做任何合理的事情,我只想记录这种情况并将错误返回给用户。所以我看不出有什么理由应该返回“err”手动展开堆栈,实际上我会丢失stacktrace和上下文,并且更难找到错误的原因。

有没有什么我错过了,所以这种方法不会很好地工作?似乎大多数Go文章都建议不要使用panic/recover,但我不明白为什么。它看起来非常像Java(和类似语言)中的旧抛接机制,并且非常适合web应用程序。

共有1个答案

冯育
2023-03-14

有没有什么我错过了,所以这种方法不会很好地工作?

这是今天讨论的(!)2014年11月4日,戴夫·切尼在“错误处理与异常还原”中

C++异常仍然像三十年前一样难以安全使用。当调用堆栈的任何部分在没有警告的情况下爆炸时,难怪许多C++商店要求不使用异常

throw new SomeoneElsesProblem();
panic("inconceivable")

使用err的其他方法在官方wiki页面“错误处理和执行”中进行了讨论。

也就是说,文章“defer、Panic和recover”确实提到了Panic的一个实际情况(JSON包,(d*decodestate)unmarshal方法),并添加:

Go库中的约定是,即使包在内部使用panic,其外部API仍然会显示显式的错误返回值。

 类似资料:
  • 我必须在数据库中存储的文档中搜索,这些文档中有图像,所以我使用tess4j来读取这些图像。在使用eclipse的windows中,项目可以与tess4j一起工作,如果我在windows7中的Tomcat6.35中部署应用程序,项目也可以工作,我可以正确地使用tess4j进行搜索。sous windows,1)我在tomcat lib/shared中添加了jar文件,2)tessdata和dll文件

  • 问题内容: 我想使用html applet标记在我的Web应用程序中运行简单applet,但是它给出了类似的错误 java.lang.ClassNotFoundException:MyApplet 请给我示例应用程序,如果可能的话..... 问题答案: 问题是applet引擎在您定义的代码库中找不到MyApplet类。 这是因为您在/ WEB-INF / classes目录中进行了分类。该目录受s

  • 本章将教您如何使用Maven管理基于Web的项目。 在这里,您将学习如何创建/构建/部署和运行Web应用程序。 创建Web应用程序 要创建一个简单的Java Web应用程序,我们将使用maven-archetype-webapp插件。 所以,让我们打开命令控制台,转到C:\MVN目录并执行以下mvn命令。 C:\MVN>mvn archetype:generate -DgroupId = com

  • 我试图通过以下教程在我的Web应用程序中配置log4j2。我正在使用glassfish 4.1。1服务器和servlet版本3.1。我可以使用以下配置配置日志功能: log4j。性质 属性文件放在src/main/资源文件夹中 网状物xml 定义文件位置的上下文参数被注释掉。默认情况下,log4j可能会查找名为log4j的文件。财产。不过,我只是想知道指定文件位置的方法是否正确。 我也不确定哪个j

  • 我正在使用以下源代码目录结构的JavaEE Web应用程序: 我感兴趣的文件夹是:它包含、用于设置servlet的xml文件、SpringBean连接上下文以及JSP标记和视图。我试图理解是什么限制/定义了这种结构。例如,JSP文件是否总是必须在中,或者它们可能在其他地方?在WEB-INF中是否还有其他内容?维基百科的WAR文件条目提到了Java类的,JAR文件的——我不确定除了其他源文件位置之外

  • 问题内容: 自两年以来,我一直在使用java(Servlets,JSPs)进行Web应用程序开发。在那两年中,我从不需要在任何项目中使用(明确地- 众所周知,servlet容器使用线程为不同的请求提供相同的servlet)。 但是,每当我参加Web开发人员职位(java)的面试时,就会有几个与java中的线程相关的问题。我知道Java线程的基础知识,因此回答问题不是问题。但是有时我会感到困惑,是否