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

Go代码如何针对异常(panic)进行规划?

上官凯歌
2023-03-14
    null

共有1个答案

裴学
2023-03-14

当然,您可以使用panic来html" target="_blank">控制程序的正常流,但我认为在这种情况下,更惯用的方法是只向调用方返回错误(比如格式错误的用户输入)。

Panic通常用于表示程序中存在某种bug的特殊情况。如果出现问题,您可以自己调用panic,但在零指针取消引用、数组访问越界和其他类似情况下,也可以自动调用panic。通常这样的事情会使程序崩溃,默认情况下它会这样做,但如果您的程序是某种服务,您可能不希望整个程序崩溃,您只希望它停止在遇到崩溃时正在做的事情,并返回到正常状态。

以web服务器为例,如果某个奇怪的请求由于某个bug导致了一个越界数组访问。您不希望整个服务器崩溃,而是希望它退出该请求的处理程序函数,但继续监听新的请求。如何做到这一点在示例二中有很好的描述。因此,您将recover()函数推迟到希望恐慌停止的地方。如果恢复返回一个错误,您知道您的程序正在panicking。然后你可以做一些日志记录,也许给自己发一封邮件说有问题,等等,然后继续正常的程序流。但是,如果您有一些验证函数注意到请求有问题,您可能不希望它恐慌。相反,您希望它向调用方(请求处理程序)返回一个错误,然后调用方(请求处理程序)可以用400个错误请求回答请求,然后正常退出处理程序。

 类似资料:
  • 5.9. Panic异常 Go的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、空指针引用等。这些运行时错误会引起painc异常。 一般而言,当panic异常发生时,程序会中断运行,并立即执行在该goroutine(可以先理解成线程,在第8章会详细介绍)中被延迟的函数(defer 机制)。随后,程序崩溃并输出日志信息。日志信息包括panic value和函数调用的堆栈跟

  • 当发生像数组下标越界或类型断言失败这样的运行错误时,Go 运行时会触发运行时 panic,伴随着程序的崩溃抛出一个 runtime.Error 接口类型的值。这个错误值有个 RuntimeError() 方法用于区别普通错误。 panic 可以直接从代码初始化:当错误条件(我们所测试的代码)很严苛且不可恢复,程序不能继续运行时,可以使用 panic 函数产生一个中止程序的运行时错误。panic 接

  • Panic表示的意思就是有些意想不到的错误发生了。通常我们用来表示程序正常运行过程中不应该出现的,或者我们没有处理好的错误。 package main import "os" func main() { // 我们使用panic来检查预期不到的错误 panic("a problem") // Panic的通常使用方法就是如果一个函数 // 返回一个我们不知道怎么处理

  • 问题内容: 如您所知,异常情况下会引发异常。那么如何模拟这些异常呢?我觉得这是挑战。对于此类代码段: 有人有好主意吗? 问题答案: 其他答案已经解决了如何编写用于检查是否引发异常的单元测试的一般问题。但是我认为您的问题实际上是在询问如何获取代码以首先引发异常。 以您的代码为例。在简单的单元测试的环境中,很难在内部引发异常。问题是,为了使异常发生,代码(通常)需要在网络中断的计算机上运行。安排在单元

  • 问题内容: 可以(在Linux上)是普通文件不知何故有用吗?我知道它主要用于套接字,但是奇怪。 问题答案: 并不是的。仅对通常在读取/写入时表现出阻塞行为的文件描述符(如管道和套接字)有意义。普通文件描述符总是会立即或多或少地立即返回结果或文件结束,因此不会对它们有用。

  • 问题内容: 最近,我的一位同事编写了一些代码,以捕获整个方法周围的空指针异常,并返回单个结果。我指出了空指针可能有多种原因,因此我们将其更改为对一个结果的防御性检查。 但是,捕获NullPointerException对我来说似乎是错误的。在我看来,空指针异常是错误代码的结果,而不是系统中预期的异常。 在任何情况下捕获空指针异常都有意义吗? 问题答案: 是的,捕获任何东西几乎总是一种代码气味。该C