错误和异常

一. 语法错误

初学Python的时候最容易犯的错误就是语法错误。例如:

 

 这就是一个典型的语法错误,如果错误信息是以“SyntaxError”开头,这就说明Python解释器认为这是一个语法错误,同时Python会很贴心地提示在哪个文件的第几行的第几个字符开始出错(虽然有时候错误的位置可能并不准确)。语法错误通常意味着使用的Python书写格式或者使用方法不正确,Python不会完整运行带有语法错误的程序。这时候只需要按照提示阅读Python基础语法,修改相关错误内容即可。

二. 异常

解释:即使Python程序的语法是正确的,但是在运行的时候也可能会发生一些预想之外的错误。运行时检测到错误被称为异常,有些错误可能并不是致命的,但如果程序对大多数的异常都不做处理,Python解释器会输出异常信息到屏幕上并终止程序。

 在这个例子输出的结果中有个除零错误“ZeroDivisionError”,还有以"Traceback"开头的错误,像这种错误我们称为异常。不同的异常会有不同的错误名字输出。

三. 异常处理

异常是在程序运行时才会检测到的错误,有时候是不可预期的。有些错误也不是致命的,我们也不希望它们影响程序的完整运行。

上面这个例子会让用户不断地输入内容,如果用户输入的是数字,则程序会不断地运行;如果用户输入的是非数字内容,则程序会输出错误并且退出。

 

看到输出的错误信息为“ValueError”,这告诉我们“abcd”没有办法转化为数字。我们并不能预见用户会输入什么数据,只有在程序运行的时候用户输入了错误内容,程序才会出错。这个错误是一个非常典型的异常。如果我们不希望因为用户输入了一些不符合规范的数据而使程序出错不能运行,这个时候我们需要处理这些异常,确保程序不会无故退出。

 

 这个程序用了两个新的关键字:try和except。这两个关键字用于捕获异常并让我们运行相应的代码去处理异常。语法如下:

在try业务语块中,产生任何异常都会终止业务语法快并跳到except匹配异常类型。如果匹配得上,则运行处理异常的语法快,否则程序就报错退出。

 

 这是一个典型的处理异常的例子。首先在try中编写我们的业务逻辑代码,然后根据错误类型定义多个异常处理的except语法。如果有多个expect,那么Python解释器会逐个匹配except后的异常类型,如果匹配到则运行相应的处理异常的语法块,如果没有匹配到则输出异常并退出程序。由于大部分异常都是从Exception这个父类继承过来的,所以如果匹配的异常类型是Exception,就总是可以匹配到所有异常。

四. 抛出异常

前面的例子都是系统抛出的异常,在Python中我们也可以主动抛出异常。可以使用raise语句抛出一个指定的异常。

在抛出异常的时候回来又错误提示信息“这是错误信息”,在手动抛出异常的时候,我们可以使用这个方法提示用户程序哪里出现了问题。下面列举一些常见的异常:

 五. finally子句

Python中的finally子句需要和try子句一起使用。finally子句在异常处理中的作用是:无论是否有异常或者是否捕获了异常,finally子句都会保证执行。例如:

 

从执行结果中可以看出,程序在捕获到“ZeroDivisionError”之后仍然会执行finally子句中的代码。

 从执行结果可以看出,由于我们的异常是“ZeroDivisionError”,所以except并不能捕获相关的异常,程序报错退出,但是我们仍然可以看到finally子句中的代码执行了。无论try子句中是否发生异常,finally子句都会被执行。这个特性在以后的数据库和文件中相当有用,因为无论是数据库还是文件处理,在做了一些操作之后都需要进行一些必要的善后工作。

六. 知识扩展

我们已经知道了Python有许多内建的异常类。内建的异常类可以满足大部分需求,但还是会有Python内建的异常无法满足需求的时候,Python也可以提供自定义异常的方法。

自定义异常应该继承来自Exception类,可以直接继承,也可以间接继承。如:

从执行结果可以看到,当我们使用“raise”抛出自定义异常的时候,系统会收到这个异常并输出我们预先定义好的错误信息。

我们也可以使用“except”捕获这个自定义的异常:

 使用except顺利捕获了自定义异常“MyException”。

 

posted @ 2023-02-09 17:33  惟默  阅读(81)  评论(0编辑  收藏  举报