本节重点
- 相识什么优劣常
- 相识常见非常的种类
- 把握非常处理惩罚
本节时长需控制在15分钟内
一 什么优劣常
非常就是步调运行时发生错误的信号(在步调出现错误时,则会产生一个非常,若步调没有处理惩罚它,则会抛出该非常,步调的运行也随之停止),在python中,错误触发的非常如下[图片上传失败...(image-a60e74-1649937489926)]
而错误分成两种
1.语法错误(这种错误,根本过不了python表明器的语法检测,必须在步调实验前就改正)
#语法错误树模一if#语法错误树模二def test: pass#语法错误树模三class Foo pass#语法错误树模四print(haha)2.逻辑错误
#TypeError:int范例不可迭代for i in 3: pass#ValueErrornum=input(">>: ") #输入helloint(num)#NameErroraaa#IndexErrorl=['egon','aa']l[3]#KeyErrordic={'name':'egon'}dic['age']#AttributeErrorclass Foo:passFoo.x#ZeroDivisionError:无法完成盘算res1=1/0res2=1+'str'二 非常的种类
在python中差别的非常可以用差别的范例(python中同一了类与范例,范例即类)去标识,一个非常标识一种错误
常见非常
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError 输入/输出非常;根本上是无法打开文件ImportError 无法引入模块或包;根本上是路径标题或名称错误IndentationError 语法错误(的子类) ;代码没有准确对齐IndexError 下标索引超出序列界限,比如当x只有三个元素,却试图访问x[5]KeyError 试图访问字典里不存在的键KeyboardInterrupt Ctrl+C被按下NameError 利用一个还未被赋予对象的变量SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)TypeError 传入对象范例与要求的不符合UnboundLocalError 试图访问一个还未被设置的局部变量,根本上是由于尚有一个同名的全局变量,导致你以为正在访问它ValueError 传入一个调用者不盼望的值,纵然值的范例是准确的更多非常
ArithmeticErrorAssertionErrorAttributeErrorBaseExceptionBufferErrorBytesWarningDeprecationWarningEnvironmentErrorEOFErrorExceptionFloatingPointErrorFutureWarningGeneratorExitImportErrorImportWarningIndentationErrorIndexErrorIOErrorKeyboardInterruptKeyErrorLookupErrorMemoryErrorNameErrorNotImplementedErrorOSErrorOverflowErrorPendingDeprecationWarningReferenceErrorRuntimeErrorRuntimeWarningStandardErrorStopIterationSyntaxErrorSyntaxWarningSystemErrorSystemExitTabErrorTypeErrorUnboundLocalErrorUnicodeDecodeErrorUnicodeEncodeErrorUnicodeErrorUnicodeTranslateErrorUnicodeWarningUserWarningValueErrorWarningZeroDivisionError三 非常处理惩罚
为了包管步调的结实性与容错性,即在遇到错误时步调不会瓦解,我们须要对非常举行处理惩罚,
如果错误发生的条件是可预知的,我们须要用if举行处理惩罚:在错误发生之前举行防备
AGE=10while True: age=input('>>: ').strip() if age.isdigit(): #只有在age为字符串情势的整数时,下列代码才不会堕落,该条件是可预知的 age=int(age) if age == AGE: print('you got it') break如果错误发生的条件是不可预知的,则须要用到try...except:在错误发生之后举行处理惩罚
#根本语法为try: 被检测的代码块except 非常范例: try中一旦检测到非常,就实验这个位置的逻辑#举例try: f=open('a.txt') g=(line.strip() for line in f) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g))except StopIteration: f.close()四 try..except...详细用法
1.非常类只能用来处理惩罚指定的非常情况,如果非指定非常则无法处理惩罚
s1 = 'hello'try: int(s1)except IndexError as e: # 未捕捉到非常,步调直接报错 print e2.多分支
s1 = 'hello'try: int(s1)except IndexError as e: print(e)except KeyError as e: print(e)except ValueError as e: print(e)3.万能非常Exception
s1 = 'hello'try: int(s1)except Exception as e: print(e)4.也可以在多分支厥后一个Exception
s1 = 'hello'try: int(s1)except IndexError as e: print(e)except KeyError as e: print(e)except ValueError as e: print(e)except Exception as e: print(e)5.非常的其他机构
s1 = 'hello'try: int(s1)except IndexError as e: print(e)except KeyError as e: print(e)except ValueError as e: print(e)#except Exception as e:# print(e)else: print('try内代码块没有非常则实验我')finally: print('无论非常与否,都会实验该模块,通常是举行清算工作')6.自动触发非常
try: raise TypeError('范例错误')except Exception as e: print(e)7.自界说非常
class EgonException(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msgtry: raise EgonException('范例错误')except EgonException as e: print(e)8.断言:assert 条件
assert 1 == 1 assert 1 == 29.总结try..except
1:把错误处理惩罚和真正的工作分开来
2:代码更易构造,更清晰,复杂的工作使命更容易实现;
3:毫无疑问,更安全了,不至于由于一些小的疏忽而使步调意外瓦解了; |