当前位置: 首页 > wzjs >正文

网站开发教程 模板做网站建设的好处

网站开发教程 模板,做网站建设的好处,wordpress 插件安装,网页编辑按哪个键使用 defer 和 recover 捕获 panic 的示例 在 Go 语言中,defer 和 recover 是处理 panic 的两个重要机制。下面是一个完整的示例,展示如何使用 defer 语句中的 recover 来捕获并处理 panic: package mainimport ("fmt" )func mai…

使用 defer 和 recover 捕获 panic 的示例

在 Go 语言中,deferrecover 是处理 panic 的两个重要机制。下面是一个完整的示例,展示如何使用 defer 语句中的 recover 来捕获并处理 panic:

package mainimport ("fmt"
)func main() {// 正常执行fmt.Println("调用safeDivide(10, 2)")safeDivide(10, 2)// 触发 panic 的情况fmt.Println("\n调用safeDivide(10, 0)")safeDivide(10, 0)// 程序继续执行fmt.Println("\n程序继续执行...")
}func safeDivide(a, b int) {// 使用 defer 定义一个匿名函数来处理可能的 panicdefer func() {if r := recover(); r != nil {fmt.Printf("捕获到 panic: %v\n", r)fmt.Println("已恢复执行")}}()fmt.Printf("计算 %d / %d\n", a, b)result := divide(a, b)fmt.Printf("结果是: %d\n", result)
}func divide(a, b int) int {if b == 0 {// 当除数为0时,主动触发 panicpanic("除数不能为零!")}return a / b
}

输出结果:

调用safeDivide(10, 2)
计算 10 / 2
结果是: 5调用safeDivide(10, 0)
计算 10 / 0
捕获到 panic: 除数不能为零!
已恢复执行程序继续执行...

关键点说明:

  1. defer 语句确保函数退出时执行恢复逻辑
  2. recover() 只在 defer 函数中有效,它会捕获 panic 并返回 panic 的值
  3. 如果没有发生 panic,recover() 返回 nil
  4. 使用这种模式可以防止 panic 导致整个程序崩溃
  5. 恢复后程序会从 panic 点之后继续执行(实际上是继续执行 defer 之后的代码)

实际应用场景

这种技术常用于:

  • 防止第三方库的 panic 导致程序崩溃
  • 在关键服务中实现优雅的错误恢复
  • 在测试中捕获预期中的 panic

注意:不应该滥用 panic/recover 作为常规错误处理机制,Go 中通常使用 error 返回值来处理可预期的错误。


案例

1. 关键服务中实现优雅的错误恢复

package mainimport ("fmt""log""net/http"
)// recoverMiddleware 是一个中间件,用来捕获处理过程中所有的 panic
func recoverMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {defer func() {if err := recover(); err != nil {// 记录错误日志,避免服务崩溃log.Printf("recover from panic: %v, request: %s %s", err, r.Method, r.URL.Path)// 返回 500 错误响应给客户端,防止崩溃信息泄露http.Error(w, "Internal Server Error", http.StatusInternalServerError)}}()// 调用下一个处理器next.ServeHTTP(w, r)})
}// simulateThirdPartyLibrary 是模拟的第三方库,可能会 panic
func simulateThirdPartyLibrary() {panic("第三方库炸了: connection pool corrupted")
}// handleRequest 是业务处理函数,调用了可能 panic 的第三方库
func handleRequest(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "业务处理中...")simulateThirdPartyLibrary() // 调用第三方库fmt.Fprintln(w, "业务处理完成") // 不会执行到这里
}func main() {// 注册路由,包上 recover 中间件http.Handle("/", recoverMiddleware(http.HandlerFunc(handleRequest)))log.Println("服务启动在 :8080")if err := http.ListenAndServe(":8080", nil); err != nil {log.Fatalf("服务启动失败: %v", err)}
}
  • recoverMiddleware 是标准写法:统一捕获每一次 HTTP 请求里的 panic,不影响其他请求继续工作。

  • 如果 simulateThirdPartyLibrary() 发生了 panic,recover 能记录日志并且返回安全的 500 错误,而不会让服务器整体挂掉。

  • 防止了单次异常影响整个服务,特别适合防御那些质量差但必须依赖的第三方库。


2. 防止第三方库 panic 导致程序崩溃

package mainimport ("encoding/json""fmt""log"
)// 第三方服务客户端
type ThirdPartyClient struct{}func (c *ThirdPartyClient) ParseResponse(data []byte) (map[string]interface{}, error) {defer func() {if r := recover(); r != nil {log.Printf("第三方库发生 panic: %v", r)}}()// 模拟第三方库内部可能 panic 的情况var result map[string]interface{}if err := json.Unmarshal(data, &result); err != nil {return nil, fmt.Errorf("解析失败: %w", err)}// 模拟第三方库可能 panic 的逻辑if _, ok := result["critical"]; !ok {panic("缺少 critical 字段") // 第三方库的不合理设计}return result, nil
}func main() {client := &ThirdPartyClient{}// 测试正常情况goodData := []byte(`{"critical": true, "value": "正常数据"}`)if res, err := client.ParseResponse(goodData); err != nil {log.Printf("处理正常数据时出错: %v", err)} else {log.Printf("正常数据结果: %v", res)}// 测试会触发第三方库 panic 的情况badData := []byte(`{"value": "缺少critical字段"}`)if res, err := client.ParseResponse(badData); err != nil {log.Printf("处理异常数据时出错: %v", err)} else {log.Printf("异常数据结果: %v", res)}// 程序继续执行log.Println("主程序继续运行...")
}

https://github.com/0voice


文章转载自:

http://lBGPpjnb.dqkrf.cn
http://Q5RT1wIa.dqkrf.cn
http://on0vww7n.dqkrf.cn
http://IorVvHEz.dqkrf.cn
http://BZYPtADd.dqkrf.cn
http://M99nWn7h.dqkrf.cn
http://YRWW9lKH.dqkrf.cn
http://BUbpfgHX.dqkrf.cn
http://qZ3tXRQk.dqkrf.cn
http://MuF13Sq1.dqkrf.cn
http://6ubH1Fvt.dqkrf.cn
http://z1fY1ZtX.dqkrf.cn
http://2XLfZ46H.dqkrf.cn
http://2USD7lwh.dqkrf.cn
http://KevHxlL5.dqkrf.cn
http://oYeCzlXQ.dqkrf.cn
http://8226QOWR.dqkrf.cn
http://HrLI3UFj.dqkrf.cn
http://xzisy8aZ.dqkrf.cn
http://sKNy4crn.dqkrf.cn
http://7TwWrMfJ.dqkrf.cn
http://ZNa6lk4V.dqkrf.cn
http://DldJBsmg.dqkrf.cn
http://MhVdwOqX.dqkrf.cn
http://CTmyJ6Rr.dqkrf.cn
http://rwSlSPAz.dqkrf.cn
http://E4HBZZ9P.dqkrf.cn
http://aJFesYTx.dqkrf.cn
http://plcIn9qR.dqkrf.cn
http://wFKTtu6p.dqkrf.cn
http://www.dtcms.com/wzjs/699175.html

相关文章:

  • 韶关住房和城乡建设网站google play官网下载
  • 深圳建站公司招聘营销外包团队
  • 做网站的保证承诺wordpress悬浮音乐
  • 建站优化一条龙牡丹江建设行业协会网站
  • seo网站关键词优化软件自己在线房屋设计免费
  • 网络公司除了做网站用网站做淘客怎么做
  • 外贸网站优化中国设计之窗官方网站
  • 如何自己免费做网站上海闵行区网站建设
  • 育贤网站建设防疫给自己写个人先进事迹
  • 网站定制开发北京网页游戏开发软件
  • 网站不提交表单网站建设作业百度云资源
  • 杭州哪家网站建设好WordPress头像不能本地化
  • 做网站运营需要学什么软件炫酷的动画网站
  • 做视频开头的外国网站买电脑的怎么下wordpress
  • 怎样经营好一个网站免费建网站赚钱
  • 做的精美的门户网站推荐wordpress 禁止评论
  • 免费学ps的网站有哪些网站主页模板
  • 网站备案 停站做企业宣传网站公司
  • 网站建设汇报材料网站运营岗位职责描述
  • 优惠券的网站制作使用iis6搭建网站
  • 义乌网站建设设邢台市应急管理局
  • 做服装外贸哪个网站好拼车网站开发
  • 龙岗网站建设公司信息行业门户网站建设
  • 东莞 网站 建设 雕塑城阳天河小学网站建设
  • 东莞网站seo方法赣州品牌网站建设
  • 海淘直邮购物网站大都会同行票怎么使用视频
  • 怎样做企业学校网站个人网站名称
  • 可免费商用的cms建站系统网站流量的主要来源有
  • 机床回收网站建设企业文化设计
  • 南京高端网站开发专业医疗建站