V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
yezheyu
V2EX  ›  问与答

go 语言新手,请教个关于异常的问题

  •  
  •   yezheyu · Jul 25, 2025 · 1087 views
    This topic created in 286 days ago, the information mentioned may be changed or developed.

    为啥下面这段代码,未捕获到 panic

    package main
    
    import "fmt"
    
    func main() {
        defer func() {
        	fmt.Println("-----") // 未执行
            if err := recover(); err != nil {
                fmt.Println("捕获到 panic:", err)
            }
        }()
        1 / 0
    }
    
    // 输出:
    // # command-line-arguments
    // ./a.go:11:9: invalid operation: division by zero
    

    而手动抛出 panic ,则可以被捕获到

    package main
    
    import "fmt"
    
    func main() {
        defer func() {
        	fmt.Println("-----") // 执行
            if err := recover(); err != nil {
                fmt.Println("捕获到 panic:", err)
            }
        }()
        panic("+++++")
    }
    
    // 输出:
    // -----
    // 捕获到 panic: +++++
    
    Rickkkkkkk
        1
    Rickkkkkkk  
       Jul 25, 2025
    除零不可以被 recover 的,类似的还有并发 map
    Vegetable
        2
    Vegetable  
       Jul 25, 2025
    不是,你上边的写法都没编译成功,没有真正的运行。
    SethShi
        3
    SethShi  
       Jul 25, 2025
    楼上说的对, 你那个是编译检查错误, 不是运行时错误, 1/0 是可以被捕获成功的, 骗一下编译器

    package main

    import (
    "fmt"
    )

    func main() {
    defer func() {
    if err := recover(); err != nil {
    fmt.Println("捕获到 panic:", err) // 会执行
    }
    }()
    // 通过变量绕过编译器的除零检查
    a, b := 1, 0
    _ = a / b // 运行时 panic: integer divide by zero
    }
    yezheyu
        4
    yezheyu  
    OP
       Jul 25, 2025
    @Vegetable
    @seth19960929
    懂了,谢谢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3058 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 15:07 · PVG 23:07 · LAX 08:07 · JFK 11:07
    ♥ Do have faith in what you're doing.