在初学Python的时候最容易犯的错误就是Python的语法错误。python
在Python中,若是错误信息是以 "SyntaxError" 开头,表示这是一个语法错误;Python解释器会提示在哪一个文件的第几行的什么位置出现错误;语法错误一般意味着书写格式或使用方式不正确。函数
程序在运行时,若是Python解释器遇到一个错误,会中止程序的执行,而且提示一些错误信息,这就是异常。code
程序中止执行而且提示错误信息这个动做,一般称之为抛出异常(raise Exception)。对象
在程序开发中,若是对某些代码的执行不能肯定是否正确,能够增长try(尝试)来捕获异常。blog
捕获异常最简单的语法格式以下:图片
try: 尝试执行的代码 except: 出现错误的处理
try:尝试,下方编写要尝试的不肯定是否可以正常执行的代码。开发
except:若是不是,下方编写提示错误的代码。字符串
print('简单的捕获异常') while True: try: num = int(input('请输入一个整数:')) except: print('请输入有效的数字!') break print('-' * 9)
捕获异常 请输入一个整数:10 --------- 请输入一个整数:a 请输入有效的数字!
在程序执行时,可能会遇到不一样类型的异常,而且须要针对不一样类型的异常,作出不一样的响应,这个时候就须要捕获错误类型。input
针对错误类型捕获异常的语法格式以下:io
try: # 尝试执行的代码 pass except 错误类型1: # 针对错误类型1,对应的代码处理 pass except (错误类型2, 错误类型3): # 针对错误类型2和3,对应的代码处理 pass except Exception as result: print('未知错误%s' % result)
当Python解释器抛出异常时,最后一行错误信息的第一个单词,就是错误类型。
在开发时,要预判到全部可能出现的错误,仍是有必定难度的。 若是但愿程序不管出现任何错误,都不会由于抛出异常而被终止,则能够增长一个未知错误的异常判断。
print('针对错误类型捕获异常') while True: try: num = int(input('请输入一个整数:')) result = 8 / num print(result) except ValueError: print('传入无效的参数!') except ZeroDivisionError: print('除0错误!') break print('-' * 9)
针对错误类型捕获异常 请输入一个整数:a 传入无效的参数! --------- 请输入一个整数:0 除0错误!
print('捕获未知错误') while True: try: num = int(input('请输入一个整数:')) result = 8 / num print(result) except ValueError: print('传入无效的参数!') except Exception as e: print('未知错误:%s' % e) break print('-' * 9)
捕获未知错误 请输入一个整数:a 传入无效的参数! --------- 请输入一个整数:0 未知错误:division by zero
在实际开发中,为了可以处理复杂的异常状况,相应有一套完整的异常语法,语法格式以下:
try: # 尝试执行的代码 pass except 错误类型1: # 针对错误类型1,对应的代码处理 pass except (错误类型2, 错误类型3): # 针对错误类型2和3,对应的代码处理 pass except Exception as result: print('未知错误%s' % result) else: # 没有异常才会执行的代码 pass finally: # 不管是否有异常或是否捕获了异常,finally子句都会保证执行 pass
print('捕获异常的完整语法') while True: try: num = int(input('请输入一个整数:')) result = 8 / num print(result) except ValueError: print('传入无效的参数!') except Exception as e: print('未知错误:%s' % e) else: print('尝试成功!') # 没有异常才会执行 finally: print('结束!') # 不管有没有异常都会执行 print('-' * 9)
捕获异常的完整语法 请输入一个整数:8 1.0 尝试成功! 结束! --------- 请输入一个整数:a 传入无效的参数! 结束! --------- 请输入一个整数:0 未知错误:division by zero 结束!
当函数/方法执行出现异常,会将异常传递给函数/方法的调用一方,若是传递到主程序,仍然没有异常处理,程序才会被终止。
在开发中,能够在主函数中增长异常捕获;而在主函数中调用的其它函数,只要出现异常,都会传递到主函数的异常捕获中;这样就不须要在代码中,增长大量的异常捕获,可以保证代码的简洁。
def demo1(): return int(input('请输入一个整数:')) def demo2(): return demo1() try: print(demo2()) except ValueError: print('请输入有效的数字!') except Exception as result: print('未知错误%s' % result)
请输入一个整数:a 请输入有效的数字!
在开发中,除了代码执行出错Python解释器会抛出异常以外,还能够根据应用程序特有的业务需求主动抛出异常。
Python中提供了一个 "Exception" 异常类,在开发时若是知足特定业务需求时,但愿抛出异常,那么应该首先建立一个 "Exception" 的对象,其次使用 "raise" 关键字抛出异常对象。
当前函数只负责提示用户输入密码,若是密码长度不正确,须要由其它的函数进行额外处理。
需求:
def input_password(): pwd = input('请输入密码:') # 提示用户输入密码 if len(pwd) >= 8: # 判断密码长度是否 >= 8,若是是则返回输入的密码 return pwd print('主动抛出异常') ex = Exception('密码长度小于8位数!') # 建立异常对象,可使用错误信息字符串做为参数 raise ex # 主动抛出异常 try: # 捕获异常 print(input_password()) except Exception as result: print(result)
请输入密码:12345 主动抛出异常 密码长度小于8位数!