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

所有的运行时错误都可以在Go中恢复吗?

凤柏
2023-03-14
package main

import (
    "fmt"
)

func errorHandler() {
    r := recover()
    err := r.(error)
    if err == nil {
        return
    }
    fmt.Println(err.Error())
}

func foo() {
    defer errorHandler()
    smallSlice := []int{1, 0, 1}
    smallSlice[10] = 1
}

func main() {
    foo()
    fmt.Println("recovery, end of main")
}

有没有运行时错误只会使程序崩溃而没有可恢复的恐慌的例子?

共有1个答案

顾靖
2023-03-14

首先更改errorhandler(),因为如果没有panics,r将为nil,因此类型断言将失败:

func errorHandler() {
    if r := recover(); r != nil {
        fmt.Println(r)
    }
}

下面是一些产生不可恢复的运行时错误的代码示例:

func foo() {
    defer errorHandler()
    _ = make([]int64, 1<<40) // You have to change the size on 32-bit systems
}

有关详细信息,请参阅如何从并发的map写入中恢复?,例如,请参阅将map[string]字符串编组到json会返回错误吗?

func foo() {
    defer errorHandler()
    m := map[string]int{}

    go func() {
        for {
            m["x"] = 1
        }
    }()
    for {
        _ = m["x"]
    }
}
func foo() {
    defer errorHandler()

    var f func(a [1000]int64)
    f = func(a [1000]int64) {
        f(a)
    }
    f([1000]int64{})
}
func foo() {
    defer errorHandler()
    var f func()
    go f()
}
func foo() {
    defer errorHandler()
    select {}
}
 类似资料:
  • 大部分错误并没有严重到需要程序完全停止执行。有时,一个函数会因为一个容易理解并做出反应的原因失败。例如,如果尝试打开一个文件不过由于文件并不存在而操作失败,这时我们可能想要创建这个文件而不是终止进程。 回忆一下第二章 “使用 Result 类型来处理潜在的错误” 部分中的那个 Result 枚举,它定义有如下两个成员,Ok 和 Err: T 和 E 是泛型类型参数;第十章会详细介绍泛型。现在你需要

  • 问题内容: 下面的代码与硬编码的JSON数据一起正常工作,但是当我从文件中读取JSON数据时不起作用。我得到使用时的错误。 硬编码JSON数据的工作示例: 输出: 不起作用-读取JSON数据文件的示例: 输出值 主机 问题答案: 当主功能结束时,Go程序结束。 从语言规范 程序执行首先初始化主程序包,然后调用函数main。当该函数调用返回时,程序退出。它不等待其他(非主)goroutine完成。

  • 突然有一天,糟糕的事情发生了,而你对此束手无策。对于这种情况,Rust 有 panic!宏。当执行这个宏时,程序会打印出一个错误信息,展开并清理栈数据,然后接着退出。出现这种情况的场景通常是检测到一些类型的 bug 而且程序员并不清楚该如何处理它。 当出现 panic! 时,程序默认会开始 展开(unwinding),这意味着 Rust 会回溯栈并清理它遇到的每一个函数的数据,不过这个回溯并清理的

  • 令我惊讶的是,即使在Java中发生了StackOverflowerError之后,仍然可以继续执行。 我知道StackOverflowerError是类错误的子类。类错误被描述为“Throwable的一个子类,表示合理的应用程序不应试图捕捉的严重问题。” 这听起来更像是一个建议而不是规则,补充说捕获像StackOverflow Error这样的错误实际上是允许的,这取决于程序员不这样做的合理性。看

  • 主要内容:net 包中的例子,错误接口的定义格式,自定义一个错误,示例:在解析中使用自定义错误Go语言的错误处理思想及设计包含以下特征: 一个可能造成错误的函数,需要返回值中返回一个错误接口(error),如果调用是成功的,错误接口将返回 nil,否则返回错误。 在函数调用后需要检查错误,如果发生错误,则进行必要的错误处理。 Go语言没有类似 Java 或 .NET 中的异常处理机制,虽然可以使用 defer、panic、recover 模拟,但官方并不主张这样做,Go语言的设计者认为其他

  • 问题内容: 我想编写三个同时发送整数的并发go例程。现在,我的代码已正确编译,但是在第一次执行后,出现错误“所有goroutine都处于睡眠状态- 死锁!”。我试图找到错误,但是在代码逻辑中找不到任何错误。有人可以帮助我在我的代码中查找错误。我的代码如下。提前致谢。 谁能告诉我为什么我将Routine2和Routine3声明为go例程,为什么输出为[no output]。我是GO语言的新手,据我从