Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 483|回复: 0

python 捕获异常

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-18 03:34:03 | 显示全部楼层 |阅读模式

    异常:由于代码的逻辑或者语法错误导致的程序中断。

    在学习Python的过程当中,大家一定要区分清楚异常和布尔值False

      布尔值的False只是一个值,通常代表的是一个条件的不成立,常用于逻辑判断

      比如:

    1 num = 2
    2 print(num > 3) 3 if num > 3: 4    print("num > 3")

        异常指的是由于代码的逻辑或者语法错误导致的程序中断

      比如:

    1 num = 2
    2 2+"2"

    了解了上面的逻辑之后,我们来看看大家在代码当中经常出现的几种错误,和常见原因

    错误类型 错误名称 错误解释
    SyntaxError 语法错误 是语法导致的错误,通常的报错是 invalid syntax,比如:缩进语句块不加冒号,遇到这种错误,就要详细的检查自己的的语句了
    IndexError 索引错误 是索引引用导致的错误,通常的报错是 list out of range,遇到这个错误就要认真的检查自己是不是取了一个超出序列长度的索引
    NameError 命名错误    是变量命名导致的错误,通常的报错是 no model named ... ,遇到这个错误就要查看自己的变量了,初学者要注意是不是字符串没有加引号
    AttributeError 属性错误 是调用对象属性时候导致的错误,通常报错是 ... object has no attribute ... 遇到这个错误就要查看自己的对象是不是调用了不存在的属性了
    KeyError 键错误 是字典取值时候导致的错误,字典没有这个键
    TypeError  类型错误 是对对象进行非本类型操作时候导致的,没有固定的报错,常见的有 ... not callabel ,遇到这种错误,要认真梳理自己对对象的操作了,比如,非函数对象加括号调用

    当然异常的类型还有好多,在这就不一一列举了,我们来看捕获异常的关键字

    捕获异常最简单的写法如下

    try:  #尝试执行缩进下面的报错
        1+"1"
    except:  #如果发生错误,打印Error
        print("Error") >>> Error

    这里我们尝试执行 1+“1”,如果可以执行就执行,如果发生错误就执行下面的代码。

    但是,在工作当中,这样的代码并没有太好的效果,我们通过这段代码既无法实现错误内容的输出,也不能实现错误的处理,只是让程序不报错的执行了下去,这个显然不好使。

    所以我们首先要考虑的就是如何获取具体的错误内容,例子如下:

    例1:

    try: 1+"1"
    except Exception as e: print(e) >>> unsupported operand type(s) for +: 'int' and 'str'

    这里我们用到了两个之前没有用到过的关键词:

      1、Exception 所有的错误

      2、as 别名

    所以例1代码的含义就是尝试执行 1+"1”,如果只成功就可以,否则无论发生任何错误,都把这个错误返回的内容起别名为e,在下面输出出来。在这里要注意的一点就是,e可以被打印但是不是字符串对象,所以不可以进行任何字符串操作。

    try: 1+"1"
    except Exception as e: print(type(e)) >>> <class 'TypeError'>

    例2:

    try: 1+"1"
    except TypeError as e: print(e) >>> unsupported operand type(s) for +: 'int' and 'str'

    这里和上面的例1唯一的不同就在于except后面跟了具体的错误类型,意思很明确,当发生TypeError的时候,我进行如下处理,至于其他错误,就让他报错去吧。

    当然这样的说法有点随性,认真的查看,着多种错误类型的捕获异常给我们对同一语句进行不同的异常处理带来了很大的遍历性,毕竟不是所有的错误都可以pass!

    了解了上面的报错,那么接下来要认真研究的就是捕获异常的另外两个关键字:else 和finally

    首先是他两的逻辑

    else:代表在try执行成功之后,进行执行,放在except的后面

    finally:代表最后,无论执行try成功还是失败,都会执行。作为最后的收尾

    了解之后,我们来查看我们例子

    例1:

     1 try:  2     1+"1"
     3 except Exception as e:  4     print(e)  5 else:  6     print("it is ok")  7 finally:  8     print("ok it's over")  9 
    10 >>> unsupported operand type(s) for +: 'int' and 'str'
    11 >>> ok it's over

    例2:

     1 try:  2     1+1
     3 except Exception as e:  4     print(e)  5 else:  6     print("it is ok")  7 finally:  8     print("ok it's over")  9 
    10 >>> it is ok 11 >>> ok it's over

    在例1当中,我们执行try失败,所以except和finally执行,在例子2当中,我们执行try成功,所以else和finally成功。

    else和finally的出现极大的方便了我们对捕获异常和异常处理的完整流程描述,不如下面的例子

     1 import pymysql  2 try:  3     #尝试连接数据库
     4     connect = pymysql.connect(  5         host = "localhost",  6         user = "root",  7         password = "123",  8         database = "outTest"
     9  ) 10 except Exception as e: 11     #失败输出错误
    12     print(e) 13 else: 14     #如果成功进行数据查询
    15     cursor = connect.cursor() 16     cursor.execute("select * from login") 17     all_data = cursor.fetchall() 18     print(all_data) 19 finally: 20     #不论如何进行结束通知
    21     print("执行结束")

    到这里,可能好多读者觉得捕获异常到此结束,其实并不是这样,还可以有一个好的建议给到大家,我们可以尝试使用。先看下面的两个案例:

    例1:

    try: 1+"1"
    except Exception as e: print(e) >>> unsupported operand type(s) for +: 'int' and 'str'

    例2:

    try: 1+"1"
    except Exception as e: error = traceback.format_exc() print(error) >>> Traceback (most recent call last): File "C:/Users/bian/Desktop/TestProject/twistedProject/twistedProject.py", line 67, in <module>
        1+"1" TypeError: unsupported operand type(s) for +: 'int' and 'str'

    例1和例2同样实现了捕获异常的功能,但是例子2的返回更加的专业,并且利于调试 

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 03:06 , Processed in 0.060456 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表