异常处理 ╰半橙微兮° 2022-12-30 07:45 148阅读 0赞 # 异常 # ## 1.什么是异常 ## 在正常运行程序当中,即使语句或表达式在语法上是正确的,但在尝试执行时,它仍可能会引发错误。 在执行时检测到的错误被称为 “异常”,异常不一定会导致严重后果。 但是,大多数异常并不会被程序处理,此时会显示如下所示的错误信息: >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Can't convert 'int' object to str implicitly 错误信息的最后一行告诉我们程序遇到了什么类型的错误。异常有不同的类型,而其类型名称将会作为错误信息的一部分中打印出来:上述示例中的异常类型依次是:[`ZeroDivisionError`][ZeroDivisionError], [`NameError`][NameError] 和 [`TypeError`][TypeError]。作为异常类型打印的字符串是发生的内置异常的名称。对于所有内置异常都是如此,但对于用户定义的异常则不一定如此(虽然这是一个有用的规范)。标准的异常类型是内置的标识符(而不是保留关键字)。 这一行的剩下的部分根据异常类型及其原因提供详细信息。 错误信息的前一部分以堆栈回溯的形式显示发生异常时的上下文。通常它包含列出源代码行的堆栈回溯;但是它不会显示从标准输入中读取的行。 [内置异常][Link 1] 列出了内置异常和它们的含义。 ## 2.如何处理异常 ## ### 2.1 try/except ### 可以编写处理所选异常的程序。请看下面的例子,它会要求用户一直输入,直到输入的是一个有效的整数,但允许用户中断程序(使用 Control-C 或操作系统支持的其他操作);请注意用户引起的中断可以通过引发 [`KeyboardInterrupt`][KeyboardInterrupt] 异常来指示。: >>> while True: ... try: ... x = int(input("Please enter a number: ")) ... break ... except ValueError: ... print("Oops! That was no valid number. Try again...") ... [`try`][try] 语句的工作原理如下。 * 首先,执行 *try 子句* ([`try`][try] 和 [`except`][except] 关键字之间的(多行)语句)。 * 如果没有异常发生,则跳过 *except 子句* 并完成 [`try`][try] 语句的执行。 * 如果在执行try 子句时发生了异常,则跳过该子句中剩下的部分。然后,如果异常的类型和 [`except`][except] 关键字后面的异常匹配,则执行 except 子句 ,然后继续执行 [`try`][try] 语句之后的代码。 * 如果发生的异常和 except 子句中指定的异常不匹配,则将其传递到外部的 [`try`][try] 语句中;如果没有找到处理程序,则它是一个 *未处理异常*,执行将停止并显示如上所示的消息。 一个 [`try`][try] 语句可能有多个 except 子句,以指定不同异常的处理程序。 最多会执行一个处理程序。 处理程序只处理相应的 try 子句中发生的异常,而不处理同一 `try` 语句内其他处理程序中的异常。 一个 except 子句可以将多个异常命名为带括号的元组,例如: ... except (RuntimeError, TypeError, NameError): ... pass ### 2.2 try/except…else ### **try/except** 语句还有一个可选的 **else** 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。 else 子句将在 try 子句没有发生任何异常的时候执行。 以下实例在 try 语句中判断文件是否可以打开,如果打开文件时正常的没有发生异常则执行 else 部分的语句,读取文件内容: for arg in sys.argv[1:]: try: f = open(arg, 'r') except IOError: print('cannot open', arg) else: print(arg, 'has', len(f.readlines()), 'lines') f.close() 使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。 ### 2.3 try-finally ### try语句有另一个可选子句,用于定义必须在所有情况下执行的清理操作。例如: >>> try: ... raise KeyboardInterrupt ... finally: ... print('Goodbye, world!') ... Goodbye, world! KeyboardInterrupt Traceback (most recent call last): File "<stdin>", line 2, in <module> 如果存在 [`finally`][finally] 子句,则 `finally` 子句将作为 [`try`][try] 语句结束前的最后一项任务被执行。 `finally` 子句不论 `try`语句是否产生了异常都会被执行。 以下几点讨论了当异常发生时一些更复杂的情况: * 如果在执行 `try` 子句期间发生了异常,该异常可由一个 [`except`][except] 子句进行处理。 如果异常没有被某个 `except` 子句所处理,则该异常会在 `finally` 子句执行之后被重新引发。 * 异常也可能在 `except` 或 `else` 子句执行期间发生。 同样地,该异常会在 `finally` 子句执行之后被重新引发。 * 如果在执行 `try` 语句时遇到一个 [`break`][break], [`continue`][continue] 或 [`return`][return] 语句,则 `finally` 子句将在执行 `break`, `continue` 或 `return` 语句之前被执行。 * 如果 `finally` 子句中包含一个 `return` 语句,则返回值将来自 `finally` 子句的某个 `return` 语句的返回值,而非来自 `try` 子句的 `return` 语句的返回值。 ## 3 抛出异常 ## [`raise`][raise] 语句允许程序员强制发生指定的异常。例如: >>> raise NameError('HiThere') Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: HiThere [`raise`][raise] 唯一的参数就是要抛出的异常。这个参数必须是一个异常实例或者是一个异常类(派生自 [`Exception`][Exception] 的类)。如果传递的是一个异常类,它将通过调用没有参数的构造函数来隐式实例化: raise ValueError # shorthand for 'raise ValueError()' 如果你需要确定是否引发了异常但不打算处理它,则可以使用更简单的 [`raise`][raise] 语句形式重新引发异常 >>> try: ... raise NameError('HiThere') ... except NameError: ... print('An exception flew by!') ... raise ... An exception flew by! Traceback (most recent call last): File "<stdin>", line 2, in <module> NameError: HiThere ## 4.用户自定义异常 ## 程序可以通过创建新的异常类来命名它们自己的异常(有关Python 类的更多信息,请参阅 [类][Link 2])。异常通常应该直接或间接地从 [`Exception`][Exception] 类派生。 可以定义异常类,它可以执行任何其他类可以执行的任何操作,但通常保持简单,通常只提供许多属性,这些属性允许处理程序为异常提取有关错误的信息。在创建可能引发多个不同错误的模块时,通常的做法是为该模块定义的异常创建基类,并为不同错误条件创建特定异常类的子类: class Error(Exception): """Base class for exceptions in this module.""" pass class InputError(Error): """Exception raised for errors in the input. Attributes: expression -- input expression in which the error occurred message -- explanation of the error """ def __init__(self, expression, message): self.expression = expression self.message = message 大多数异常都定义为名称以“Error”结尾,类似于标准异常的命名。 [参考链接][Link 3] [参考链接][Link 4] [ZeroDivisionError]: https://docs.python.org/zh-cn/3.7/library/exceptions.html#ZeroDivisionError [NameError]: https://docs.python.org/zh-cn/3.7/library/exceptions.html#NameError [TypeError]: https://docs.python.org/zh-cn/3.7/library/exceptions.html#TypeError [Link 1]: https://docs.python.org/zh-cn/3.7/library/exceptions.html#bltin-exceptions [KeyboardInterrupt]: https://docs.python.org/zh-cn/3.7/library/exceptions.html#KeyboardInterrupt [try]: https://docs.python.org/zh-cn/3.7/reference/compound_stmts.html#try [except]: https://docs.python.org/zh-cn/3.7/reference/compound_stmts.html#except [finally]: https://docs.python.org/zh-cn/3.7/reference/compound_stmts.html#finally [break]: https://docs.python.org/zh-cn/3.7/reference/simple_stmts.html#break [continue]: https://docs.python.org/zh-cn/3.7/reference/simple_stmts.html#continue [return]: https://docs.python.org/zh-cn/3.7/reference/simple_stmts.html#return [raise]: https://docs.python.org/zh-cn/3.7/reference/simple_stmts.html#raise [Exception]: https://docs.python.org/zh-cn/3.7/library/exceptions.html#Exception [Link 2]: https://docs.python.org/zh-cn/3.7/tutorial/classes.html#tut-classes [Link 3]: https://docs.python.org/zh-cn/3.7/tutorial/errors.html#tut-userexceptions [Link 4]: https://www.runoob.com/python3/python3-errors-execptions.html
相关 异常处理 异常处理 错误分类 语法错误 if 2 > 1 print(222) 未加冒号 dic = {"name"; "alex"} 字典中用冒号分隔键和 淩亂°似流年/ 2023年10月10日 10:15/ 0 赞/ 72 阅读
相关 异常处理 1、异常与错误 错误对于程序而言是致命的,运用java的异常处理机制,异常发生后经过处理,程序还是能正常运行的。如:数组越界异常、除数为0异常等。异常类是指Exception ╰半夏微凉°/ 2023年08月17日 16:09/ 0 赞/ 136 阅读
相关 异常处理 异常 1.什么是异常 在正常运行程序当中,即使语句或表达式在语法上是正确的,但在尝试执行时,它仍可能会引发错误。 在执行时检测到的错误被称为 “异常”,异常不一定会 ╰半橙微兮°/ 2022年12月30日 07:45/ 0 赞/ 149 阅读
相关 异常处理 所谓异常,就是以对象的方式表示一个或一类错误,该异常对象不仅封装了错误信息,还包含了错误发生时的“上下文”信息。传统的错误处理方式是,每当程序调用了某个方法进行了某种操作,程序 Bertha 。/ 2022年06月12日 05:12/ 0 赞/ 309 阅读
相关 异常处理 异常定义: 程序在运行时出现不正常情况。 问题也是现实生活中的一个具体事物,可以通过java类的形式进行描述。并封装成对象。Java对不正常 悠悠/ 2022年06月11日 08:12/ 0 赞/ 236 阅读
相关 异常处理 C++的异常处理机制被称为是不可恢复的:一旦异常被处理,程序的执行就不能够在异常被抛出的地方继续。如果这些 catch 子句不包含返回语句,在catch子句完成它的工作之后,程 忘是亡心i/ 2022年05月23日 03:55/ 0 赞/ 287 阅读
相关 异常处理 异常写入日志 package javaBase.io.others; import java.io.; import java.text.S 妖狐艹你老母/ 2021年12月21日 18:49/ 0 赞/ 417 阅读
相关 异常处理 概念 如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。此时,这个方法会立刻退出同时不返 系统管理员/ 2021年12月14日 08:49/ 0 赞/ 433 阅读
相关 异常处理 1.异常概述 异常的类型:Error(致命的),Exception(非致命的)以及必检和免检异常。 异常就是一种对象,表示阻止正常进行程序执行的错误或者情况。 异常 待我称王封你为后i/ 2021年11月16日 13:22/ 0 赞/ 464 阅读
相关 异常处理 一、Error java虚拟机无法解决的严重问题。比如:JVM系统内部错误、资源耗尽等严重情况。StackOverflowError。 针对这类错误,一般不编写针对性的代码 痛定思痛。/ 2021年11月16日 10:28/ 0 赞/ 372 阅读
还没有评论,来说两句吧...