1、异常概念:

>>> a

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

NameError: name 'a' is not defined     #交互模式中,类似这种的便是异常

2、异常未处理程序终止运行

当异常出现的时候,且没有做任何处理,程序不会继续执行
也就是程序被中断了。

a

print("ok")

运行结果:

E:\>python a.py

Traceback (most recent call last):

File "a.py", line 1, in <module>

a                            #出现异常后,且没有做处理,

NameError: name 'a' is not defined   # a.py的第二行代码并没有被执行

  服务端程序:出现异常没有捕获,程序就中断了
 

3、异常信息的作用:

1)指明出错的代码行位置,line xx

2)异常类型与具体异常说明

4、异常的影响:

异常的出现是不好的,未处理异常会中断,程序就退出。

程序退出了,就不能完成程序预期的功能

微软曾经统计过,功能性的代码与异常处理的代码数量的比例是1:1

养成一个习惯:
1)把异常的信息搞明白什么意思
2)出错的代码在哪一行,具体的代码是啥。具体分析。

 
 5、为什么会出现异常:
1) 程序出错了。1/0  变量没定义
2) 用户输入的数据问题
def add(a,b)
    return a+b
a=input("a:")
b=input("b:")
hello
100
print(add(a,int(b)))
3) 运行中,性能的问题。内存泄漏、句柄泄露。
 
 6、异常捕获的应用场景:
1 )可能程序出错的地方
2 )异常处理用户可能输入的错误数据
3 )异常处理可能出现的系统(I/O)的错误
4 )异常处理可能出现的网络的错误
 

7、写程序的原则

1)程序不能崩溃

2)能够提示用户或者程序员明确的信息

8、系统内置的异常信息:

>>> dir(__builtins__)

['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

9、异常处理模型:

 try:
   result = 1/0  #代码出现异常时,程序会从try跳出来,到except中被拦截,触发
   print("ok")  #except代码块的执行,所以try中的print语句没有被执行
except:    #except后面没有名字,默认会拦截所有异常
    print("出现一些错误了!")

print("Done!")

 

***  try不能单独存在,必须有except或者finally

***  try和else也不能单独存在。

10、使用具体的异常信息拦截

try:

result=1/0

print("ok")

except ZeroDivisionError:

print("除0错误")

except NameError:

print("变量未定义")

print("Done")

运行结果:

E:\>python a.py

除0错误

Done

------------------------------------------------------

 try:
   s
   print("ok")
except ZeroDivisionError:
    print("出现除0的操作了!")
except NameError:
    print("变量没定义!")

print("Done")

运行结果:

E:\>python a.py

变量未定义

Done

-------------------------------------------------

小练习:使用try:except拦截不同的异常,并给出具体的错误信息

try:

print(s)                 #try代码块中有两个错误:变量未定义和除0错误

result=1/0              #变量未定义在前

except ZeroDivisionError:

print("除0错误")

except NameError:

print("变量未定义")

print("Done")

运行结果:

E:\>python a.py

变量未定义                 #最先输出变量未定义,结束程序

Done

#try里面的代码产生的多个异常,只会有一个被抛出,异常信息,只会被拦截一次。便结束程序。

--------------------------------------------------

11、缩进错误与语法错误是编译报出来的错误,并不是程序执行时的错误。

try:

result=1/0              #除0错误在前

open("e:\\ab.txt")      #缩进错误在后

except ZeroDivisionError:

print("除0错误")

except FileNotFoundError:

print("文件不存在")

print("Done")

运行结果:

E:\>python a.py

File "a.py", line 3

open("e:\\ab.txt")

^

IndentationError: unexpected indent    #提示缩进错误

原因为:缩进错误与语法错误是编译器报出来的,此时程序还未执行,故会先报出来!

---------------------------------------------------

12、错误的堆栈

 def a():
    print("a")
    b()

def b():
    print("b")
    c()

def c():
    print("c")
    d()

def d():
    print(1/0)

a()

 

运行结果;

E:\>python a.py

a

b

c

Traceback (most recent call last):

File "a.py", line 17, in <module>   #函数的调用堆栈,将执行过程显示出来。

a()

File "a.py", line 3, in a                  #line17-line3-line7-line11-line15显示了调用的先后顺序。

b()

File "a.py", line 7, in b

c()

File "a.py", line 11, in c

d()

File "a.py", line 15, in d

print(1/0)

ZeroDivisionError: division by zero

--------------------
 def a():
    print(xx)
    b()

def b():
    print("b")
    c()

def c():
    print("c")
    d()

def d():
    print(1/0)

a()

--------------------------------------------------- 
13、默认的except与具体的异常信息共存时:

try:

1/0

print("ok")

except:                         #未写明具体异常信息的except在前

print("出现了一些错误")

except ZeroDivisionError:         #写明具体的异常信息在后

print("存在除0错误")

运行结果:

E:\>python a.py

File "a.py", line 3

print("ok")

^

SyntaxError: default 'except:' must be last  #运行时提示错误:默认'except:'必须是最后一个,except必须在最后

14、拦截未拦截住,程序中断

try:

print(a)                          #存在a未定义的错误

except ZeroDivisionError:              #但是异常只有一个除0错误的拦截

print("存在除0错误")

#也没有except:拦截所有异常的语句

print("ok")

运行结果:

E:\>python a.py

Traceback (most recent call last):

File "a.py", line 2, in <module>

print(a)

NameError: name 'a' is not defined      #输出结果提示:a未定义,但是ok并没有被打印,说明程序未正常执行完毕,出现中断

解决方法:拦截所有异常

try:

print(a)

except ZeroDivisionError:

print("存在除0错误")

except:                             #拦截到所有可能出现的异常

print("出现未知异常!")

print("ok")

运行结果:

E:\>python a.py

出现未知异常!

ok                                 #ok被打印,程序正常执行完毕

15、输出系统提示的错误信息:

try:

print(a)

except NameError as e:           #将系统提示的错误信息作为e保存,变量名不必须是e

print("变量未定义")          #输出自己定义的错误信息

print(e)                    #输出系统的提示错误信息

except :

print("出现未知异常!")

print("ok")

运行结果:

E:\>python a.py

变量未定义

name 'a' is not defined              #输出了系统的错误提示信息.但是这个方法没有显示

ok                               #堆栈信息,不会显示第几行出现了错误

e是一个对象。查看异常对象中的内容:

>>>dir(e)

['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'with_traceback']

16、同时显示堆栈信息和报错行数的方法;

import traceback                 #引入traceback这个包

try:

print(a)

except NameError as e:

print("变量未定义")

print(e)

print(traceback.print_exc())    #打印堆栈信息      

except :

print("出现未知异常!")

print("ok")

运行结果:

E:\>python a.py

变量未定义                     #自己写的输出的内容

name 'a' is not defined           #打印的系统提示的错误信息e

Traceback (most recent call last):   #打印的堆栈信息和报错行数等

File "a.py", line 4, in <module>

print(a)

NameError: name 'a' is not defined

None                          #traceback.print_exc()的返回值

ok                             #程序已全部执行完毕

简化后的代码是:

import traceback

try:

print(a)

except NameError:

print(traceback.print_exc())

except :

print("出现未知异常!")

print("ok")

运行结果:

E:\>python a.py

Traceback (most recent call last):

File "a.py", line 4, in <module>

print(a)

NameError: name 'a' is not defined

None

ok

17、try、else和finally

  1. else:在try执行完所有内部的代码后,没有异常的情况下才会被执行。有异常,则不会被执行。
  2. finally代码块下的内容,不论try代码块中是否有异常,均会被执行。通常finally都是用于释放资源。

1)  try中有异常

try:

print(a)

except NameError:

print("变量未定义")

except :

print("出现未知异常!")

else:

print("没有出现异常")

finally:

print("无论如何,我都会被执行")

print("ok")

运行结果:

E:\>python a.py

变量未定义                        #try中有异常,else代码块的内容未被执行

无论如何,我都会被执行            #try中异常,finally被执行

ok

2) try中无异常

try:

print("gloryroad")

except NameError:

print("变量未定义")

except :

print("出现未知异常!")

else:

print("没有出现异常")

finally:

print("无论如何,我都会被执行")

print("ok")

运行结果:

E:\>python a.py

gloryroad

没有出现异常                     #try中无异常,else代码块下的内容被执行

无论如何,我都会被执行           #try中无异常,finally代码块下的内容被执行

ok

18、抛出异常

1)       抛出异常的位置在实际异常的前面

import traceback

try:

raise ZeroDivisionError         #抛出异常,抛出异常的位置在print(1/0)

print(1/0)                      #前面,所以会直接排除异常,不会执行下面的

except NameError:                  #print(1/0)的语句

print("未知异常")

except ZeroDivisionError:

print(traceback.print_exc())

else:

print("没有出现异常")

finally:

print("无论如何,我都会被执行")

print("ok")

运行结果:

E:\>python a.py

Traceback (most recent call last):

File "a.py", line 3, in <module>

raise ZeroDivisionError

ZeroDivisionError

None                          #输出except ZeroDivisionError下的内容

无论如何,我都会被执行         #try中有异常,else代码块中的程序未执行,输出finally

ok                             #中的内容

2)       抛出异常的位置在实际异常的后面

import traceback

try:

print(a)

raise ZeroDivisionError

except NameError:

print("未知异常")

except ZeroDivisionError:

print(traceback.print_exc())

else:

print("没有出现异常")

finally:

print("无论如何,我都会被执行")

print("ok")

运行结果:

E:\>python a.py

未知异常                         #最先输出实际代码的错误,抛出异常被短路

无论如何,我都会被执行           #抛出异常的语句未执行

ok

3)       抛出异常的应用场景

满足语法要求,但是不符合业务规则。

class TooBigException(Exception):   #自定义一个异常

pass

num=int(input("请输入一个数字:"))

try:

if num>=100:

raise TooBigException    #当数字大于100时,抛出异常

except TooBigException:          #抛出异常所打印的内容

print("输入的数字大于100")

else:

print("没有出现异常")

finally:

print("无论如何,我都会被执行")

print("ok")

运行结果:

E:\>python a.py

请输入一个数字:102

输入的数字大于100

无论如何,我都会被执行

ok

19、try和except嵌套

try:

1/1

try:                 #该代码块抛出异常后,执行外部的except语句

1/0

except:

raise           #raise后不必非得跟错误名称 ,触发异常向上处理

print("未知异常1")

except:

print("未知异常2")

运行结果:

E:\>python a.py

未知异常2

try:
    1/1
    try:
        1/0
    except:
        print("raise")#看内层的except是否有执行
        raise
except:
    print("未知错误!")

-----------------------------------------------------------

小知识:

如何判断一个字符串是json串。

提示:json串的特点是:

{
    "employees": [
        {
           
"firstName": "Bill",
           
"lastName": "Gates"
        },
        {
           
"firstName": "George",
           
"lastName": "Bush"
        },
        {
           
"firstName": "Thomas",
           
"lastName": "Carter"
        }
    ]
}

>>> import json

>>>
d={1:"a"}

>>> s=json.dumps(d)         #将字典转换成json串

>>> s

'{"1":
"a"}'

>>> s=json.loads(s)           #将json串转成字典

>>> s

{'1': 'a'}

import json
d={1:'a'}
s=json.dumps(d)
print(s,type(s))
d=json.loads("xxxx")
print(type(d))
 

使用该知识实现判断一个字符串是不是个合法的json串的异常的应用场景实例:

import json
d='xxxxxxx'
try:
    d=json.loads(d)
except:
    print("不是一个合法的json串类型")

----------------------------------------------------------------------

小练习:

  1. 使用try:except拦截不同的异常,并给出具体的错误信息。

try:

open("e:\\ab.txt")

result=1/0

except ZeroDivisionError:

print("除0错误")

except FileNotFoundError:

print("文件不存在")

print("Done")

运行结果:

E:\>python a.py

文件不存在

Done

 
20、异常和if
def div(a,b):
    try:
        result = a/b
    except TypeError:
        print("出现了类型不匹配的情况")
    except ZeroDivisionError:
        print("被除数为0的异常出现了")
 
print(div(2,1))
print(div(1,"x"))
print(div(1,0))
 ------------------------------------------------
def div(a,b):
    if not (isinstance(a,(int,float)) and \
isinstance(b,(int,float))):
       print("不全是数字!")
       return None 
    try:
        result = a/b
    except TypeError:
        print("出现了类型不匹配的情况")
    except ZeroDivisionError:
        print("被除数为0的异常出现了")
    
print(div(2,1))
print(div(1,"x"))
print(div(1,0))
 
 

python入门(十一):异常的更多相关文章

  1. python入门19 异常及异常处理 异常捕获

    常见异常举例 """ 一些异常举例:""" '''模块不存在 ModuleNotFoundError: No module named 'd ...

  2. python入门学习:9.文件和异常

    python入门学习:9.文件和异常 关键点:文件.异常 9.1 从文件中读取数据9.2 写入文件9.3 异常9.4 存储数据 9.1 从文件中读取数据 9.1.1 读取整个文件  首先创建一个pi_ ...

  3. Python入门笔记(17):错误、异常

    一.什么是错误,什么是异常,它们两者区别 这里解释如下:个人觉得很通俗易懂 错误是指在执行代码过程中发生的事件,它中断或干扰代码的正常流程并创建异常对象.当错误中断流程时,该程序将尝试寻找异常处理程序 ...

  4. Python入门学习系列——Python文件和异常

    从文件中读取数据 首先准备一个文本文件,文件中存储着普通文本数据.读取文件需要调用open()和read()函数. 读取整个文件 代码示例: with open('pi_digits.txt') as ...

  5. python入门简介

    Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...

  6. Python入门篇-文件操作

    Python入门篇-文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.文件IO常用操作 open:打开 read:读取 write:写入 close:关闭 readlin ...

  7. Python基本语法[二],python入门到精通[四]

    在上一篇博客Python基本语法,python入门到精通[二]已经为大家简单介绍了一下python的基本语法,上一篇博客的基本语法只是一个预览版的,目的是让大家对python的基本语法有个大概的了解. ...

  8. Python入门版

    一.前言 陆陆续续学习Python已经近半年时间了,感觉到Python的强大之外,也深刻体会到Python的艺术.哲学.曾经的约定,到现在才兑现,其中不乏有很多懈怠,狼狈. Python入门关于Pyt ...

  9. 老鸟的Python入门教程

    转自老鸟的Python入门教程 重要说明 这不是给编程新手准备的教程,如果您入行编程不久,或者还没有使用过1到2门编程语言,请移步!这是有一定编程经验的人准备的.最好是熟知Java或C,懂得命令行,S ...

  10. python 入门快速学习整理

    Python 入门学习 1  : 对象类型 1 1.1 列表 1 1.2 字典 2 1.3 元组 2 1.4 元组 2 1.4 文件 3 2  : 条件和循环语句 3 2.1  if else语句 3 ...

随机推荐

  1. H3C BFD MAD检测方式的IRF典型配置举例

    一.组网需求 由于网络规模迅速扩大,当前中心交换机(Device A)转发能力已经不能满足需求,现需要在保护现有投资的基础上将网络转发能力提高一倍,并要求网络易管理.易维护. 二.组网图 三.配置思路 ...

  2. 解决讨厌的警告 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

    问题: 执行任何hadoop命令,都会提示如下WARN.虽然影响不大,但是每次运行一个命令都有这么个WARN,让人很不爽,作为一个精致的男人, 必须要干掉它. [root@master logs]# ...

  3. CentOS7 搭建 SVN 服务器

    CentOS7 搭建 SVN 服务器 介绍SVN: SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上 ...

  4. javascript+html5+canvse+3d俄罗斯方块

    javascript+html5+canvse+3d俄罗斯方块 必须使用支持html5的浏览器打开,比如firefox,chrome 得分:0速度:1000 // 你的浏览器不支持 <canva ...

  5. [蓝桥杯]PREV-22.历届试题_国王的烦恼

    问题描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能存在多座桥连接.然而,由于海水冲刷,有一些大桥面临着不能使用的危险. 如果两个小岛间 ...

  6. Windows7环境下Excel2010中图片超链接默认打开程序修改

    在Windows7的环境下,打开Excel2010超链接图片,都是默认用IE打开.搜索了所有的中文网络,没有找到解决方案,且发现受此困扰的人不少.后来用纯英文搜索,终于找到解决方案并尝试成功. 1,操 ...

  7. CentOS下puppet安装

    简介 Puppet是开源的基于Ruby的系统配置管理工具,puppet是一个C/S结构, 当然,这里的C可以有很多,因此,也可以说是一个星型结构. 所有的puppet客户端同一个服务器端的puppet ...

  8. markdwon语法与Typora

    我也是在视频中看到别人的操作,不知道这是个什么玩意? 直到无意间看到了markdown,才意识到其他人用的是markdown. 当你看到一个人使用类似 ![blockchain](https://ss ...

  9. Unity 代码组件获取和使用、Resources加载、OnGUI、Time、Mathf、PlayerPref

    1.     游戏物体组件获取.添加组件(重要) 作业分析: 子弹生成:坦克生成----->坦克控制类里生成子弹 子弹飞行:子弹自己飞,不能通过坦克控制类进行管理: 获取代码组件,设置子弹速度: ...

  10. JS 实现兼容IE图片向左或向右翻转

    <!DOCTYPE HTML> <head> <title>JS实现图片向左向右翻转</title> <meta http-equiv=" ...