【Python】从入门到上头— 错误和异常以及调试(5)

news2024/10/5 19:19:53

文章目录

  • 一.错误和异常
    • 1.语法错误
    • 2.异常
  • 二.异常处理
    • 1.try/except
    • 2.try/except...else
    • 3.try-finally
  • 三.抛出异常
  • 四.用户自定义异常
  • 五.调试
    • print()
    • 断言
    • logging
    • IDE

一.错误和异常

  • Python 有两种错误很容易辨认:语法错误和异常。

    • Python assert(断言)用于判断一个表达式,在表达式条件为false的时候触发异常。
      在这里插入图片描述

1.语法错误

Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例

>>> while True print('Hello world')
  File "<stdin>", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax
  • 这个例子中,函数 print() 被检查到有错误,是它前面缺少了一个冒号 :

    • 语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个小小的箭头

2.异常

  • 即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常

    • 大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:
>>> 10 * (1/0)             # 0 不能作为除数,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero

>>> 4 + spam*3             # spam 未定义,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2               # int 不能与 str 相加,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

二.异常处理

1.try/except

在这里插入图片描述

  • 异常捕捉可以使用 try/except 语句。
    • 例如:让用户输入一个合法的整数,但是允许用户中断这个程序(使用Control-C或者操作系统提供的方法)。用户中断的信息会引发一个 KeyboardInterrupt 异常。

      while True:
          try:
              x = int(input("请输入一个数字: "))
              break
          except ValueError:
              print("您输入的不是数字,请再次尝试输入!")
      
      • 首先,执行 try (在关键字 try 和关键字 except 之间的语句)。

      • 如果没有异常发生,忽略 except ,try 执行后结束。

      • 如果在执行 try 的过程中发生了异常,那么 try 子句余下的部分将被忽略。

        • 如果异常的类型和except之后的名称相符,那么对应的 except 子句将被执行。
      • 如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。

一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。

except (RuntimeError, TypeError, NameError):
    pass
  • 最后一个except子句可以忽略异常的名称,它将被当作通配符使用。你可以使用这种方法打印一个错误信息,然后再次把异常抛出。

    import sys
    
    try:
        f = open('myfile.txt')
        s = f.readline()
        i = int(s.strip())
    except OSError as err:
        print("OS error: {0}".format(err))
    except ValueError:
        print("Could not convert data to an integer.")
    except:
        print("Unexpected error:", sys.exc_info()[0])
        raise
    

2.try/except…else

try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。

  • else 子句将在 try 子句没有发生任何异常的时候执行。

在这里插入图片描述

  • 以下实例在 try 语句中判断文件是否可以打开,如果打开文件时正常的没有发生异常则执行 else 部分的语句,读取文件内容
for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

3.try-finally

  • try-finally 语句无论是否发生异常都将执行最后的代码。
    在这里插入图片描述
try:
    runoob()
except AssertionError as error:
    print(error)
else:
    try:
        with open('file.log') as file:
            read_data = file.read()
    except FileNotFoundError as fnf_error:
        print(fnf_error)
finally:
    print('这句话,无论异常是否发生都会执行。')

三.抛出异常

Python 使用 raise 语句抛出一个指定的异常。

  • raise语法格式如下:
raise [Exception [, args [, traceback]]]

在这里插入图片描述

  • 以下实例如果 x 大于 5 就触发异常:

    x = 10
    if x > 5:
        raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
    

执行结果

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
Exception: x 不能大于 5。x 的值为: 10

四.用户自定义异常

以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:

class MyError(Exception):
        def __init__(self, value):
            self.value = value
        def __str__(self):
            return repr(self.value)
   
try:
   raise MyError(2*2)
except MyError as e:
   print('My exception occurred, value:', e.value)

执行结果

My exception occurred, value: 4
>>> raise MyError('oops!')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'

五.调试

print()

第一种方法简单直接粗暴有效,就是用print()把可能有问题的变量打印出来看看:

def foo(s):
    n = int(s)
    print('>>> n = %d' % n)
    return 10 / n

def main():
    foo('0')

main()

断言

凡是用print()来辅助查看的地方,都可以用断言(assert)来替代:

def foo(s):
    n = int(s)
    assert n != 0, 'n is zero!'
    return 10 / n

def main():
    foo('0')

assert的意思是,表达式n != 0应该是True,否则,根据程序运行的逻辑,后面的代码肯定会出错。

  • 如果断言失败,assert语句本身就会抛出AssertionError:

    $ python err.py
    Traceback (most recent call last):
      ...
    AssertionError: n is zero!
    

logging

把print()替换为logging是第3种方式,和assert比,logging不会抛出错误,而且可以输出到文件

import logging

s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)
  • logging.info()就可以输出一段文本。运行,发现除了ZeroDivisionError,没有任何信息。怎么回事?

  • 别急,在import logging之后添加一行配置再试试:

  • 它允许你指定记录信息的级别,有debug,info,warning,error

    import logging
    logging.basicConfig(level=logging.INFO)
    
  • 看到输出了:

    $ python err.py
    INFO:root:n = 0
    Traceback (most recent call last):
      File "err.py", line 8, in <module>
        print(10 / n)
    ZeroDivisionError: division by zero
    
  • logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件

IDE

  • 如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有:
    • Visual Studio Code:https://code.visualstudio.com/,需要安装Python插件。

    • PyCharm:http://www.jetbrains.com/pycharm/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/940056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多种定位技术融合,破局室内外高精度定位

随着我国自主研发的北斗三号全球卫星导航系统的开通&#xff0c;全球定位服务进入了一个新的时代。北斗系统提供了全天候、全天时、室内外高精度的定位服务&#xff0c;使得定位服务不再受限于时间和空间的限制&#xff0c;全民都能够享受到定位服务带来的便利。 北斗高精度定位…

为 LVGL 添加截图功能(lv_100ask_screenshot)

完整的演示视频观看&#xff1a; https://www.bilibili.com/video/BV18r4y1X7MJ 前言 lv_100ask_screenshot 是一个基于 lvgl 的屏幕截图工具。 lv_100ask_screenshot 特性&#xff1a; 可以将LVGL的屏幕对象(全屏)保存为图片文件&#xff1a;lv_scr_act()&#xff0c;laye…

每日汇评:在美国就业数据公布之前,黄金将在两条关键移动平均线之间波动

1、金价在跌破1920美元上方后进入盘整阶段&#xff1b; 2、在中国推动的乐观情绪中&#xff0c;美元出现调整&#xff0c;投资者权衡鲍威尔的更高更长利率观点&#xff1b; 3、黄金价格徘徊在21日和200日移动平均线之间&#xff0c;RSI看跌&#xff0c;交易清淡&#xff1b; …

C# NetTopologySuite+ProjNet 任意图形类型坐标转换

添加引用&#xff1a;NetTopologySuite、ProjNet、ProjNet.SRID Program.cs文件&#xff1a; using ProjNet.CoordinateSystems; using ProjNet.CoordinateSystems.Transformations; using ProjNet.SRID; using System; using System.Collections.Generic; using System.Linq;…

【会议征稿】2023智能通信与网络国际学术会议(ICN 2023)

2023智能通信与网络国际学术会议&#xff08;ICN 2023&#xff09; 2023 International Conference on Intelligent Communication and Networking (ICN2023) 2023智能通信与网络国际学术会议&#xff08;ICN 2023&#xff09;将于2023年11月10-12日在中国常州召开。ICN 2023…

507页XX市应急管理局智慧矿山煤矿数字化矿山技术解决方案

导读&#xff1a;原文《507页XX市应急管理局智慧矿山煤矿数字化矿山技术解决方案》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 部分内容&#xff1a; 第一章 项…

打造个人的NAS云存储-通过Nextcloud搭建私有云盘实现公网远程访问

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

Docker数据管理(数据卷与数据卷容器)

目录 一、数据卷&#xff08;Data Volumes&#xff09; 1、概述 2、原理 3、作用 4、示例&#xff1a;宿主机目录 /var/test 挂载同步到容器中的 /data1 二、数据卷容器&#xff08;DataVolumes Containers&#xff09; 1、概述 2、作用 3、示例&#xff1a;创建并使用…

Python工具箱系列(四十一)

使用zip批量压缩文件 前文的代码示例了使用gzip对单个文件进行压缩。本文示例使用更通用的zipfile来批量压缩文件。zipfile也是python内置的库&#xff0c;使用起来非常方便。废话不说&#xff0c;直接上代码示例。 import dbm import glob import zipfile# 保存压缩计划的库名…

冲破时代鸿沟,Linus和Eversheet,杰出程序员的创新成果

在80年代末&#xff0c;电脑技术的普及程度与今日相较&#xff0c;犹如鸿沟天堑。那时&#xff0c;计算机对大多数人来说还是稀罕物&#xff0c;尤其在像中国这样的发展中国家。 与如今充满信息的网络环境相比&#xff0c;那个时代没有Web&#xff0c;没有Google等搜索引擎&am…

Mysql--技术文档--B树-数据结构的认知

阿丹解读&#xff1a; B树&#xff08;B tree&#xff09;和B树&#xff08;B-tree&#xff09;都是常见的自平衡搜索树数据结构&#xff0c;用于在存储和检索大量数据时提供高效的操作。 基本概念-B树/B树 B树&#xff08;B-tree&#xff09;和B树&#xff08;B tree&#x…

提升生产效率,降低运维成本:纺织业物联网网关应用

在众多物联网技术应用中纺织业正逐渐崭露头角。物联网技术通过无线连接纺织设备、PLC、传感器&#xff0c;实现了纺织厂的生产数据信息的远程监控和数据采集、远程管理&#xff0c;为企业提供了更高效、智能的生产方式。智联物联小编在本文中将重点介绍纺织业物联网的应用与通讯…

每天一道动态规划——第二天

通过第一道的动态规划&#xff0c;有没有点感觉了&#xff1f; 一般我们就是先暴力递归&#xff0c;自己多试试&#xff0c;试试感觉就出来了。 然后加缓存&#xff0c;这种傻缓存&#xff0c;一般就是不依赖之前的状态&#xff0c;还有递归。 后面就直接从初始状态把所有的表…

手把手教你搭建Serv-U FTP服务器共享文件并实现外网远程访问「无公网IP」

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天&#xff0c;移动电子设备似乎成了我们生活的主角&#xff0c;智能…

数据分析基础-数据可视化学习笔记04-互动方式

交互方式 交互&#xff08;Interaction&#xff09;是指用户与系统、设备或其他用户之间的相互作用、传递信息和交流的过程。在计算机科学、人机交互和用户体验领域&#xff0c;交互是用户与技术之间的核心概念&#xff0c;它决定了用户如何与计算机系统或其他技术进行沟通、操…

批量剪辑系统矩阵分发管理开发软件

一、视频批量剪辑素材要求 抖音的 OAuth API 以https://open.douyin.com/ 开头。 超过 50MB 的视频建议采用分片上传&#xff0c;可以降低网关超时造成的失败。超过 128MB 的视频必须采用分片上传。视频总大小 4GB 以内。单个分片建议 20MB&#xff0c;最小 5MB。 为了更好的观…

1行代码实现Python数据分析:图表美观清晰,自带对比功能丨开源

你是否也在朋友圈看过这样的小广告&#xff1a; 「你要悄悄学Python&#xff0c;然后惊艳所有人。」 现在&#xff0c;GitHub上一位博主告诉你&#xff1a;不用学&#xff0c;用sweetviz就行。 这是一个基于Python编写的数据分析软件&#xff0c;只要掌握3种函数用法&#xf…

Elasticsearch 优化

Elasticsearch 优化 2.1硬件选择 Elasticsearch 的基础是 Lucene &#xff0c;所有的索引和文档数据是存储在本地的磁盘中&#xff0c;具体的 路径可在 ES 的配置文件 ../config/elasticsearch.yml 中配置&#xff0c;如下&#xff1a; #----------------------------…

使用acme,自动续签免费的SSL,无忧http升级https

使用acme自动续签免费的SSL 安装acme.sh颁发域名将证书安装到nginx下配置nginx的ssl自动续签 这里只进行最简单的操作 安装acme.sh 进入你的用户目录&#xff0c;如果你使用root登陆&#xff0c;那么你的用户目录就是 /root/ curl https://get.acme.sh | sh -s emailmyexam…

[Qt开发思想探幽]QObject、模板继承和多继承

[Qt开发思想探幽]QObject、模板继承和多继承 [Qt开发探幽]QObject、模板继承和多继承***1. QObject为什么不允许模板继承&#xff1a;******2.如果需要使用QObject进行多继承的话&#xff0c;子对象引用的父类链至多只能含有一个QObject******3.如果使用模板类和QObject做多继承…