介绍下不同语言的异常处理机制

Golang

在Go语言中,有两种用于处于异常的机制,分别是errorpanic

panic

panic 是 Go 中处理异常情况的机制,用于表示程序遇到了无法恢复的错误,需要终止执行。

使用场景

  • 程序出现严重的不符合预期的问题,比如数组越界访问、map并发操作;
  • 程序的初始化或关键部分出现问题,比如配置文件丢失或数据库连接失败。

示例代码

package mainimport ("fmt"
)// 会引发 panic 的函数
func mayPanic() {panic("something went wrong!")
}// 使用 recover机制 捕获 panic
func safeFunction() {defer func() {if r := recover(); r != nil {fmt.Println("Recovered from panic:", r)}}()mayPanic()fmt.Println("This line will not be executed if panic occurs.")
}func main() {fmt.Println("Starting the program...")safeFunction()fmt.Println("Program continues to execute after recovering from panic.")
}

error

error 是 Go 中用于处理预期错误的机制,常用于函数返回值中。

使用场景

  • 被调用函数可能出现失败,但这种失败是业务逻辑的一部分,比如文件不存在或用户重复操作;
  • 函数调用者需要可以根据错误返回值进行下一步处理。

示例代码

package mainimport ("errors""fmt"
)func divide(a, b int) (int, error) {if b == 0 {// 程序在这里返回一个error类型的数据return 0, errors.New("cannot divide by zero")}return a / b, nil
}func main() {result, err := divide(10, 0)if err != nil {fmt.Println("Error:", err)return}fmt.Println("Result:", result)
}

Java

Java 中的异常和错误继承自 Throwable 类,也分为以下两类:

img

异常

Checked Exceptions(受检异常)

  • 必须在编译期处理(通过 try-catchthrows 声明)。
  • 表示程序可以恢复预期可能发生的问题。
  • 常见受检异常:
    • IOException
    • SQLException
    • FileNotFoundException

Unchecked Exceptions(非受检异常)

  • 不要求在编译期处理,可以选择捕获或忽略。
  • 表示程序逻辑错误或运行时异常,通常是由编程错误引发的。
  • 常见非受检异常:
    • NullPointerException
    • IndexOutOfBoundsException
    • ArithmeticException

示例代码

try {int result = 10 / 0; // 可能引发 ArithmeticException
} catch (ArithmeticException e) {System.out.println("Caught an arithmetic exception: " + e.getMessage());
}

错误

错误不是异常,是脱离程序员控制的问题,错误在代码中通常被忽略;比如当栈溢出时,就会发生错误,这类错误在编译器无法检测,也非程序预期逻辑。

在Java中,因为Error也是Exception的子类,所以可以被捕获,但因为Error的影响不可控,一般不建议捕获;

示例代码

try {// 触发 OutOfMemoryErrorint[] largeArray = new int[Integer.MAX_VALUE];
} catch (OutOfMemoryError e) {// 这里也可以用Exception类来捕获,但过于宽泛System.err.println("OutOfMemoryError caught: " + e.getMessage());// 清理资源或记录日志
} finally {System.out.println("Perform cleanup in finally block.");
}

Rust

Rust语言和Go类似,也是把异常分为两种;一种是可恢复的Error,另一种是不可恢复的Panic

Result

在Rust语言中,使用Result处理可恢复的错误,它是一个枚举类型

enum Result<T, E> {Ok(T),  // 操作成功,包含成功的值Err(E), // 操作失败,包含错误信息
}

示例代码

use std::fs::File;
use std::io::{self, Read};fn read_file_content(file_path: &str) -> Result<String, io::Error> {let mut file = File::open(file_path)?; // 可能返回 io::Errorlet mut content = String::new();file.read_to_string(&mut content)?; // 可能返回 io::ErrorOk(content)
}fn main() {match read_file_content("example.txt") {Ok(content) => println!("File content:\n{}", content),Err(e) => eprintln!("Error reading file: {}", e),}
}

Panic!

程序遇到不可捕获、无法继续执行的问题时,会抛出Panic!

示例代码

fn divide(a: i32, b: i32) -> i32 {if b == 0 {panic!("Division by zero!");}a / b
}fn main() {divide(10, 0); // 触发 panic!
}

PHP

PHP中也有两种异常处理机制,分别是错误处理和异常处理。

错误

PHP 的错误是指脚本运行时出现的问题,通常分为以下几类:

  • 解析错误(Parse Error):代码语法错误,无法被捕获。
  • 致命错误(Fatal Error):无法恢复的问题,如调用不存在的函数。
  • 警告(Warning):非致命错误,如文件不存在但脚本继续运行。
  • 通知(Notice):轻微的问题,如未初始化的变量。

示例代码

<?php
// 错误处理函数
function customError($errno, $errstr)
{echo "<b>Error:</b> [$errno] $errstr";
}// 设置错误处理函数
set_error_handler("customError");// 触发错误
echo($test);
?>

异常

PHP中的异常由 Exception 类及其子类表示,处理则使用 try-catch 块。

function divide($a, $b) {if ($b == 0) {throw new Exception("Division by zero!");}return $a / $b;
}try {echo divide(10, 0);
} catch (Exception $e) {echo "Caught exception: " . $e->getMessage();
}

总结

语言主要机制
Goerror 返回值,panicrecover
Java受检和非受检异常,try-catch-finally
RustResultOption 枚举,panic!
PHPExceptiontry-catch-finally
JavaScripttry-catch-finallythrow

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/1358.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用gtsam添加OrientedPlane3Factor平面约束因子

在基于地面约束的SLAM优化中&#xff0c;已知的地面信息&#xff08;如 plan.pcd 文件中的地面模型&#xff09;可以用作一个先验约束&#xff0c;以帮助优化位姿估计。具体而言&#xff0c;这个过程涉及将地面模型和每个帧的位姿结合&#xff0c;以创建一个因子模型&#xff0…

Cython全教程2 多种定义方式

—— 本篇文章&#xff0c;主要讲述Cython中的四种定义关键字 全教程2 多种定义方式&#xff1a; 在Cython中&#xff0c;关于定义的关键字有四个&#xff0c;分别是&#xff1a; cdef、def、cpdef、DEF 一、cdef定义关键字 顾名思义&#xff0c;cdef关键字定义的是一个C函数…

WINFORM - DevExpress -> DevExpress总结[安装、案例]

安装devexpress软件 路径尽量不换&#xff0c;后面破解不容易出问题 vs工具箱添加控件例如: ①使用控制台进入DevExpress安装目录: cd C:\Program Files (x86)\DevExpress 20.1\Components\Tools ②添加DevExpress控件&#xff1a; ToolboxCreator.exe/ini:toolboxcreator…

primitive 的 Appearance编写着色器材质

import { nextTick, onMounted, ref } from vue import * as Cesium from cesium import gsap from gsaponMounted(() > { ... })// 1、创建矩形几何体&#xff0c;Cesium.RectangleGeometry&#xff1a;几何体&#xff0c;Rectangle&#xff1a;矩形 let rectGeometry new…

《JavaWeb开发-javascript基础》

文章目录 《JavaWeb开发-javascript基础》1.javascript 引入方式2.JS-基础语法-书写语法2.1 书写语法2.2 输出语句 3.JS-基础语法-变量4.JS-基础语法-数据类型&运算符4.1 数据类型4.2 运算符4.3 数据类型转换 5. JS-函数6. JS-对象-Array数组7. JS-对象-String字符串8. JS-…

从CentOS到龙蜥:企业级Linux迁移实践记录(龙蜥开局)

引言&#xff1a; 在我们之前的文章中&#xff0c;我们详细探讨了从CentOS迁移到龙蜥操作系统的基本过程和考虑因素。今天&#xff0c;我们将继续这个系列&#xff0c;重点关注龙蜥系统的实际应用——特别是常用软件的安装和配置。 龙蜥操作系统&#xff08;OpenAnolis&#…

【python基础——异常BUG】

什么是异常(BUG) 检测到错误,py编译器无法继续执行,反而出现错误提示 如果遇到错误能继续执行,那么就捕获(try) 1.得到异常:try的执行,try内只可以捕获一个异常 2.预案执行:except后面的语句 3.传入异常:except … as uestcprint(uestc) 4.没有异常:else… 5.鉴定完毕,收尾的语…

MySQL的安装

MySQL典型的关系型数据库&#xff08;RDBMS&#xff09;&#xff1a;oracle、MySQL、SqlServer MySQL的版本 5.5~5.7、8.0 MySQL的安装和配置 下载地址&#xff1a; https://downloads.mysql.com/archives/community/ 安装包 (x86, 64-bit), MSI Installer 执行下一步即…

跨境电商领域云手机之选:亚矩阵云手机的卓越优势

在跨境电商蓬勃发展的当下&#xff0c;云手机已成为众多企业拓展海外市场的得力助手。亚矩阵云手机凭借其独特优势&#xff0c;在竞争激烈的云手机市场中崭露头角。不过&#xff0c;鉴于市场上云手机服务供应商繁多&#xff0c;企业在抉择时需对诸多要素予以审慎考量。 跨境电商…

【论文阅读】MAMBA系列学习

Mamba code&#xff1a;state-spaces/mamba: Mamba SSM architecture paper&#xff1a;https://arxiv.org/abs/2312.00752 背景 研究问题&#xff1a;如何在保持线性时间复杂度的同时&#xff0c;提升序列建模的性能&#xff0c;特别是在处理长序列和密集数据&#xff08;如…

Java100道面试题

1.JVM内存结构 1. 方法区&#xff08;Method Area&#xff09; 方法区是JVM内存结构的一部分&#xff0c;用于存放类的相关信息&#xff0c;包括&#xff1a; 类的结构&#xff08;字段、方法、常量池等&#xff09;。字段和方法的描述&#xff0c;如名称、类型、访问修饰符…

【华为云开发者学堂】基于华为云 CodeArts CCE 开发微服务电商平台

实验目的 通过完成本实验&#xff0c;在 CodeArts 平台完成基于微服务的应用开发&#xff0c;构建和部署。 ● 理解微服务应用架构和微服务模块组件 ● 掌握 CCE 平台创建基于公共镜像的应用的操作 ● 掌握 CodeArts 平台编译构建微服务应用的操作 ● 掌握 CodeArts 平台部署微…

C#学习笔记 --- 简单应用

1.operator 运算符重载&#xff1a;使自定义类可以当做操作数一样进行使用。规则自己定。 2.partial 分部类&#xff1a; 同名方法写在不同位置&#xff0c;可以当成一个类使用。 3.索引器&#xff1a;使自定义类可以像数组一样通过索引值 访问到对应的数据。 4.params 数…

用python编写一个放烟花的小程序

import pygame import random # 代码解释及使用说明&#xff1a; # 首先&#xff0c;导入 pygame 和 random 库。pygame 用于创建游戏窗口和图形绘制&#xff0c;random 用于生成随机数。 # 初始化 pygame&#xff0c;并设置屏幕尺寸为 800x600 像素&#xff0c;设置窗口标题为…

栈 (算法十二)

1.删除字符串中的所有相邻项 link:1047. 删除字符串中的所有相邻重复项 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 栈&#xff0b;模拟 code class Solution { public:string removeDuplicates(string s) {// 栈来模拟即可// string代替栈string ans;for(…

特制一个自己的UI库,只用CSS、图标、emoji图 第二版

图&#xff1a; 代码&#xff1a; index.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>M…

Linux第二课:LinuxC高级 学习记录day01

0、大纲 0.1、Linux 软件安装&#xff0c;用户管理&#xff0c;进程管理&#xff0c;shell 命令&#xff0c;硬链接和软连接&#xff0c;解压和压缩&#xff0c;功能性语句&#xff0c;结构性语句&#xff0c;分文件&#xff0c;make工具&#xff0c;shell脚本 0.2、C高级 …

数据结构(Java版)第八期:LinkedList与链表(三)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 目录 一、链表中的经典面试题 1.1. 链表分割 1.2. 链表的回文结构 1.3. 相交链表 1.4. 环形链表 一、链表中的经典面试题 1.1. 链表分割 题目中要求不能改变原来的数据顺序&#xff0c;也就是如上图所示。…

自动连接校园网wifi脚本实践(自动网页认证)

目录 起因执行步骤分析校园网登录逻辑如何判断当前是否处于未登录状态&#xff1f; 书写代码打包设置开机自动启动 起因 我们一般通过远程控制的方式访问实验室电脑&#xff0c;但是最近实验室老是断电&#xff0c;但重启后也不会自动连接校园网账户认证&#xff0c;远程工具&…

【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法,以及自动化实时数据采集

【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法&#xff0c;以及自动化实时数据采集 mmWave Studio提供的功能完全够用了 不用去纠结用DCA1000低延迟、无GUI传数据 速度最快又保证算力无非就是就是Linux板自己写驱动做串口和UDP 做雷达产品应用也不会采用DCA1000的…