为了账号安全,请及时绑定邮箱和手机立即绑定

即使例程在 Golang 中发生“运行时错误”,如何“保持主线程运行”?

即使例程在 Golang 中发生“运行时错误”,如何“保持主线程运行”?

Go
白板的微信 2023-04-04 17:13:05
我是 Goland 的新手,过去我用过 Java。我写了一个 Golang 函数来计算结果的整数部分。我在想的是使用计时器进行计算并生成随机数。但我遇到的一个问题是,如果例程出现错误,主线程将停止。有没有办法让主线程继续运行?即使例行程序有错误?下面是测试代码:func main() {    ticker := time.NewTicker(1*1000 * time.Millisecond)    for _ = range ticker.C {        rand.Seed(time.Now().Unix())        divisor := rand.Intn(20)        go calculate(divisor)    }}func calculate(divisor int){    result:= 100/divisor    fmt.Print("1/"+strconv.Itoa(divisor)+"=")    fmt.Println(result)}由于Golang的错误处理让我很困惑,我想的是错误发生在“线程”中,main函数只是负责创建线程和分配任务,应该不会在乎是否有异常发生“线程”和 main 应该始终保持运行。如果我在 Java 中这样做,我可以使用 try catch 来包围try{    result = 1/divisor;}catch(Exception e){    e.printTrace();}甚至每次在单独的线程中给divisor一个0值,主进程都不会退出,但是对于Golang,我觉得go calculate(divisor)正在开一个新的“线程”,在“线程”里面运行计算,但是为什么主进程会退出。有没有什么方法可以防止主要进度退出?谢谢。
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

使用延迟/恢复功能


package main


import (

    "fmt"

    "time"

    "math/rand"

)


func main() {


    ticker := time.NewTicker(1*1000 * time.Millisecond)

    for _ = range ticker.C {

        rand.Seed(time.Now().Unix())

        divisor := rand.Intn(20)

        go calculate(divisor)

    }

fmt.Println("that's all")

}




func calculate(divisor int){

defer func() {

        if r := recover(); r != nil {

            fmt.Println("Recovered in f", r)

        }

    }()

    result:= 100/divisor

    fmt.Printf("1/%d=", divisor)

    fmt.Println(result)

}


查看完整回答
反对 回复 2023-04-04
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信