做任务反佣金的网站,广州网站开发解决方案,章丘营销型网站建设,网站平台在线提交功能一、错误和异常 编程中出现的错误大致可以分为两类#xff1a;错误和异常。
(一)错误 错误又可以分为两类#xff1a;语法错误和逻辑错误。
1. 语法错误 语法错误又称解析错误#xff0c;它是指在编写程序时#xff0c;程序的语法不符合Python语言的规范#xff0c;导致…一、错误和异常 编程中出现的错误大致可以分为两类错误和异常。
(一)错误 错误又可以分为两类语法错误和逻辑错误。
1. 语法错误 语法错误又称解析错误它是指在编写程序时程序的语法不符合Python语言的规范导致程序无法被正确解析。这种错误通常由拼写错误、缺少冒号、括号不配对、语句以及引号等引起。 例1 表达式括号不配对引发的语法错误。 图1 SyntaxError错误用例图 例1中第一行中是括号不配对第二行变量名为关键词引发SyntaxError。 另外一切在编完程序到可以运行(通过编译)或者说通过编译之前发生的错误都归结到这里。 例2 变量未定义就用于计算。 图1 NameError用例图 例2中s i相当于s s i变量s没有定义导致s i无法执行引发NameError。 语法错误容易发现改正前程序不能正常运行系统会提供错误位置、错误类型和错误原因用户可能根据这些信息修改错误。
2. 逻辑错误 逻辑错误是指程序的逻辑不正确导致程序无法按照用户期望的方式执行或程序的算法不符合题目给出的逻辑。 存在逻辑错误程序可以正常运行但运行结果不正确。这种错误通常是由编程者的错误推理或理解偏差等引起的。比如已知三边求三角形面积但程序却求的是周长等。 例3 求闰年。如果年份能被4整除但不能被100整除那么这一年就是闰年。 如果年份能被100整除但同时也能被400整除那么这一年也是闰年。 程序可以正常运行但逻辑关系中的逻辑运算符用错导致结果不正确。如只不能被100整除都将输出“闰年”。逻辑正确的程序如下 (二)异常 异常也称运行时错误是指在程序语法和逻辑都没有错误的情况下程序在运行时出现的错误这种错误可能是由于编程者的疏忽、系统资源不足或者外部因素引起的。常见的运行时错误有除零错误、索引错误、名称错误、输入/输出错误等。大多数异常不会被程序处理从而导致程序中断抛出错误。 例4两整数除法。 正常输入如输入6和4程序正常输出“6÷41.5”如图2(a)所示当输入字母如r程序会抛出“ValueError”错误如图2(b)所示当输入带小数点的数如45.5程序也会抛出“ValueError”错误如图2(c)所示。 图2 例4异常类型 因此可以根据异常类型结合出错原因说明错误细节等进行异常的拦截与处理。 (三)异常的处理 常见内置异常码见表1表中列出了内置异常码及其含义(描述)。
表1 常见内置异常码表 可以编写程序处理选定的异常。例5会要求用户一直输入内容直到输入有效的整数。 例5 输入一个整数直到输入正确为止。 当输入不正确会进入异常处理输入正确会break跳出“死”循环。 1. Python异常处理 在 Python 中可以使用 try... except... else...finally 的方式来捕获异常并进行处理。其语法格式如下
try:正常的操作 # 可能出现异常的代码块
except [异常类型]发生异常执行这块代码 # 如果在try部份引发了异常类型异常
except [异常类型数据]:发生异常执行这块代码 # 如果引发了异常类型异常获得附加的数据
except[异常类型]:发生异常执行这块代码
else:如果没有异常执行这块代码
finally:无论是否发生异常都将执行最后的代码 其中try 语句块中的代码可能会出现异常如果出现了指定类型的异常 ExceptionName就会执行相应的 except 子句中的代码块。如果没有出现异常那么except子句不会执行但会执行else子句中的代码块。而 finally 子句中的代码块无论如何都会在 try 或 except 块执行完之后执行。 例5 除数为0的异常
try:num1 int(input(请输入第1个数))num2 int(input(请输入第2个数))print(num1 / num2)
except ZeroDivisionError:print(第2个数不能为0) 可拦截除零但不能拦截非法输入。 多个except子句
try:num1 int(input(请输入第1个数))num2 int(input(请输入第2个数))print(num1 / num2)
except ValueError:print(请输入数字)
except ZeroDivisionError:print(第2个数不能为0) 既可以拦截除零也可以拦截非法输入。 还可以不给except参数空except捕捉所有异常但区分不了异常。
try:num1 int(input(请输入第1个数))num2 int(input(请输入第2个数))print(num1 / num2)
except:print(出了问题) as语句捕捉异常原因。
try:num1 int(input(请输入第1个数))num2 int(input(请输入第2个数))print(num1 / num2)
except Exception as err:print(出了问题)print(err) # 输出异常原因 也可以将多个异常码元组作为except参数一个except块捕捉多个异常。
try:num1 int(input(请输入第1个数))num2 int(input(请输入第2个数))print(num1 / num2)
except (ValueError, ZeroDivisionError):print(无效输入) (四)触发异常 raise语句支持强制触发指定的异常。例如 raise 唯一的参数就是要触发的异常。这个参数必须是异常实例或异常类(派生自 BaseException 类例如 Exception 或其子类)。
(五)用户自定义异常 程序可以通过创建新的异常类命名自定义的异常。不论是以直接还是间接的方式异常都应从Exception类派生。 异常类可以被定义成能做其他类所能做的任何事但通常应当保持简单它往往只提供一些属性允许相应的异常处理程序提取有关错误的信息。 一般异常命名都以 “Error” 结尾类似标准异常的命名。本例命名为“CustomException”。 许多标准模块定义了自己的异常以报告他们定义的函数中可能出现的错误。