首页 > 其他分享 >Day17 异常与日志

Day17 异常与日志

时间:2023-12-04 17:55:42浏览次数:28  
标签:抛出 try finally Day17 catch Throwable 日志 异常

1. 异常的概述

在编程中,我们经常遇到各种不可预见的问题,例如:文件找不到、网络连接失败、数组越界等。这些问题我们通常称之为“异常”(Exception)。

java 把异常当作对象来处理,并定义了一个基类 java.lang.Throwable作为所有异常的超类。 java.lang.Throwable主要分为两类 错误Error 和 Exception 。

常用概念:

  • 异常类(Exception class): Java 中的所有异常类都继承自 java.lang.Throwable 类。
  • Error:这是 Throwable 的一个子类,错误通常包含那些不应由应用程序处理的严重问题。
  • Exception:这是 Throwable 的另一个子类,它表示程序可 以处理的问题。比如尝试打开一个不存在的文件等。
  • 抛出异常(Throwing an exception):当程序发生一个异常时,会创建一个异常对象,并将其抛出,提交给 Java 运行时系统。
  • 捕获异常(Catching an exception):这是对抛出异常的响应。当一个方法抛出一个异常时,这个异常可以被另一个方法捕获并处理
  • 检查异常(Checked Exceptions):编译器要求必须处置的异常。对于 Exception 及其子类(不包括 RuntimeException 及其子类),编译器强制我们在可能抛出异常的代码中使用 try-catch 语句,或者将异常传递给调用者(通过在方法签名中添加 throws 子句)
  • 非检查异常(Unchecked Exceptions):对于 RuntimeException 及其子类,编译器并不强制我们处理或声明它们。我们可以选择捕获它们,但也可以忽略它们,让它们在程序运行时自动抛出。非检查异常通常由程序逻辑错误引起,我们应该通过改正程序来避免它们,而不是试图恢复

2.异常的体系结构

任何可以作为参数传递给 catch 子句的类都必须是 java.lang.Throwable 类或者其的子类

Exception 类主要有两个子类:IOException 和 RuntimeException。IOException 类是那些可能会导致输入输出操作失败的异常,例如读取不存在的文件。而 RuntimeException 则包括程序逻辑错误,如数组越界、空指针访问等

Throwable异常的体系结构


3.异常的用途

  1. 错误处理:最直接的用途就是处理错误。例如,当你尝试打开一个不存在的文件或者尝试连接一个无法响应的网络服务时,Java 会抛出一个异常。你可以捕获这个异常并决定如何处理它,例如,重新尝试操作,或者显示一条错误信息。
    • 通过错误处理可以避免 JVM 直接停止,防止程序直接崩了
  2. 流程控制:虽然使用异常来做流程控制不是一个良好的编程习惯,但在某些特殊情况下,它可以作为一种很有效的流程控制手段。例如,在一个大的循环结构中,当满足特定条件时,你可能希望退出循环,这时可以抛出一个异常。

4.Throwable 类

4.1Throwable 类里常用方法包括:

  • public String getMessage():返回关于发生的异常的详细信息。这个信息在 Throwable 对象被创建时通过其构造函数设置。
  • public Throwable getCause():返回导致异常的原因,或者如果原因不存在或未知,则返回 null。
  • public String toString():返回一个简短的描述,包含异常的类型和详情信息。
  • public void printStackTrace():将此 Throwable 及其回溯打印到标准错误流。

4.2 抛出异常的过程

  • 通过使用 new 关键字 + Throwable 类或其子类的构造函数来创建一个 Throwable (子类)对象
  • 使用 throw 关键字来抛出 Throwable(子类)对象。
  • throws用于进行异常类的声明,若该方法可能有多种异常情况产生,那么在throws后面可以写多个异常类,用逗号隔开
修饰符 返回值类型 方法名() throws 异常类型1,异常类型2{
    //注意上面这里是throws,不是throw。而且是异常类型,不是对象
    if (判断条件) {
        //注意此处是throw,不是throws,而且是异常对象
        throw new 异常对象("异常的原因");
    }
    //方法体
}

//生成异常对象是实例,这里的Throwable也可以用其子类代替
Throwable throwable = new Throwable(”发现一个异常!“);
throw throwable;//注意此处是throw,不是throws

4.3 捕获异常与处理异常

  • try-catch 语句

使用 try-catch 语句来捕获和处理异常。在 try 块中,我们放入可能会抛出异常的代码,然后在后面的 catch 块中捕获抛出的异常对象并处理这些异常。

/*多个异常一次捕获一次处理 + 没写finally*/
try{
	//可能会抛出异常的代码块
}catch(异常类型**对象**){
	//处理异常的代码块
}
  • try-catch-finally 语句
/*多个异常一次捕获多次处理 + fianlly*/
try {
    // 可能抛出异常的代码
} catch (ExceptionType1 e) {
    // 处理 ExceptionType1 异常
} catch (ExceptionType2 e) {
    // 处理 ExceptionType2 异常
} finally {
    // 无论是否抛出异常,都将执行的代码
}
  • 多次处理实际上是一次处理

  • 多个catch的效果像 if ... else if 一样,所以在前面的判断条件需要弱于后面的,不然后面的catch永远不会执行。所以 前面的异常类型 不能是 后面异常类型的父类。

  • 有关 finally { }:

    • 无论异常是否发生,finally 内的语句都需要执行。因为异常会引发程序跳转,导致有些语句执行不到。而 finally 就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的

    • finally不能单独使用。必须配合着try…catch使用

    • 当只有在try或者catch中调用退出JVM的相关方法,此时finally才不会执行,否则finally永远会执行。

    • 通常在finally 代码块内添加语句来释放占用的资源

  • 多个异常使用捕获又该如何处理呢?

    • 多个异常分别处理

    • 多个异常一次捕获多次处理

    • 多个异常一次捕获一次处理

4.4 assert 断言

assert condition : error message;
// condition 是一个布尔类型的条件表达式,表示需要检查的条件
//error message 是一个字符串类型的错误提示信息
//如果 condition 的值为 false,则程序会在此处抛出 AssertionError 异常,输出 error message 指定的错误提示信息。
  • 断言是编程中常用的一种技术手段,它用于在程序执行时验证某些条件是否满足。如果条件成立,则程序继续执行;否则程序抛出AssertionError 异常,直接终止。
  • 注意!!!AssertionError 继承自 Error 类,是一个严重的错误,表示程序已经出现了无法处理的异常情况,会导致程序直接终止
  • 断言的主要作用是在开发和调试阶段快速定位和解决问题,有效避免因为程序中存在非预期的逻辑错误而导致程序崩溃或产生误判的情况。相对于传统的 if/else 或 try/catch 方式,使用 assert 断言可以更加简洁明了地表达程序的状态或逻辑关系,提高程序的可读性和可维护性。
  • 在使用 assert 断言时,需要注意断言语句只是一种辅助手段,不能替代异常检查。如果某个条件验证失败会产生正常异常,那么应该使用传统的异常处理机制来处理,并不应该使用断言语句。

5.自定义异常

- 自定义异常类 其实很简单, 只需要继承 Exception 类就行了
public class MyException extends Exception{
    //构造器
    //带参构造器
    //重写toString()
}

源码示例: ArrayIndexOutOfBoundsException类(数组索引越界)

public  class ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException {
    private static final long serialVersionUID = -5116101128118950844L;

    /**
     * Constructs an <code>ArrayIndexOutOfBoundsException</code> with no
     * detail message.
     */
    public ArrayIndexOutOfBoundsException() {
        super();//源码溯源会发现是在套娃调用 Exception 类内的方法
    }

    /**
     * Constructs a new <code>ArrayIndexOutOfBoundsException</code>
     * class with an argument indicating the illegal index.
     *
     * @param   index   the illegal index.
     */
    public ArrayIndexOutOfBoundsException(int index) {
        //实际上就是toSting()
        super("Array index out of range: " + index);
    }

    /**
     * Constructs an <code>ArrayIndexOutOfBoundsException</code> class
     * with the specified detail message.
     *
     * @param   s   the detail message.
     */
    public ArrayIndexOutOfBoundsException(String s) {
        super(s);//本质还是toString,不过这个是为了让其子类套娃调用
    }
}


6.日志

待填坑(后期更新)

标签:抛出,try,finally,Day17,catch,Throwable,日志,异常
From: https://www.cnblogs.com/wendao101/p/17875555.html

相关文章

  • 八. 异常处理和命名空间
    1.异常处理注意:以下内容在C++11中进行了优化,不再适用。在C++98中,为程序可能出现的异常提供了一套完整的机制,其基本语法如下:抛出异常:throw表达式;trycatch代码块:try{ 复合语句}catch(异常类型){复合语句}catch(异常类型){复合语句}抛出机制:当函......
  • ClickHouse(16)ClickHouse日志引擎Log详细解析
    日志引擎系列这些引擎是为了需要写入许多小数据量(少于一百万行)的表的场景而开发的。这系列的引擎有:StripeLogLogTinyLog共同属性引擎:数据存储在磁盘上。写入时将数据追加在文件末尾。不支持突变操作,也就是更新。不支持索引。这意味着`SELECT`在范围查询......
  • 一种全新的日志异常检测评估框架:LightAD
    本文分享自华为云社区《【AIOps】一种全新的日志异常检测评估框架:LightAD,相关成果已被软工顶会ICSE2024录用》,作者:华为云PaaS服务小智。深度学习(DL)虽然在日志异常检测中得到了不少应用,但在实际轻量级运维模型选择中,必须仔细考虑异常检测方法与计算成本的关系。具体来说,尽管深......
  • 全局异常捕获
    DispatcherUnhandledException——UI线程未被处理的异常捕获从App对象中订阅DispatcherUnhandledException事件publicpartialclassApp:Application{publicApp(){//DispatcherUI线程未被处理的异常this.Disp......
  • 无法加载windows安装程序。发生内部错误。若要安装windows,请重新启动安装——it专员实
    无法加载windows安装程序。发生内部错误。若要安装windows,请重新启动安装——it专员实习生日志(2023.12.4)导航目录无法加载windows安装程序。发生内部错误。若要安装windows,请重新启动安装——it专员实习生日志(2023.12.4)导航遇到的困难/问题描述解决的经过与思路造成的原因解......
  • Java异常处理
    异常处理是Java编程中的一个核心概念,它提供了一种强大的方法来处理运行时错误,使我们的程序更加健壮。异常是程序运行过程中发生的不正常情况,它打断了正常的指令流。本文将介绍Java中的异常处理机制,包括异常的类型、如何捕获和处理异常,以及自定义异常。异常类型在Java中,所有的异常都......
  • java 捕获异常Exception 获取异常信息的方法 e.toString() e.getMessage() e.printSta
    Java异常中e.getMessage()和e.toString()e.printStackTrace()的区别e.getMessage():打印异常的原因e.toString():打印异常类型和异常的原因e.printStackTrace():打印完整的异常堆栈信息  总结e.getMessage()和e.toString()方法:打印的异常信息太少,没有具体......
  • 单机ELK接收kafka日志环境搭建
    单机ELK接收kafka日志环境搭建1、安装elk单机环境参考以下链接:https://www.cnblogs.com/zuouncle/p/17332191.html2、搭建kafka下载kafka:https://archive.apache.org/dist/kafka/2.6.2/解压:tar-zxvfkafka_2.12-2.6.2.tgzmv kafka_2.12-2.6.2kafka创建文件夹:mkdir-p......
  • .NET 7(C#)配置使用log4net日志框架的方法
    .NET7(C#)中配置和使用log4net日志框架是一个涉及多步骤的过程。log4net是一个高度灵活且强大的日志记录库,可用于记录应用程序的运行时信息。它支持各种日志输出格式和目的地,如文件、数据库、控制台等。以下是在.NET7(C#)项目中配置和使用log4net的基本步骤:1.安装log4net......
  • python日志模块回顾
    日志模块配置文件logging.yamlversion:1formatters:simple:format:'[%(asctime)s%(thread)d][%(levelname)s]%(message)s'#日志内容的格式化,具体参数问GPT或百度dateformat:'%Y-%m-%d%H:%M:%S.%f'handlers:console:class:logging.StreamHand......