Python3入门(十二)错误和异常

简介: Python的错误和异常

学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍。Python 有两种错误很容易辨认:语法错误和异常

一、语法错误

语法错误也可以称之为解析错误,如下

if True
    print("ok")

会出现错误,因为if条件后没有加:

二、异常

即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常,大多的异常都不会被程序所处理,都是抛出异常信息

a = int("你好")

会出现如下异常

Traceback (most recent call last):
  File "/Users/colin/PycharmProjects/demo/ex/TestError.py", line 4, in <module>
    a = int("你好")
ValueError: invalid literal for int() with base 10: '你好'

三、异常处理

以下案例为用户中断程序会抛出异常

while True:
    try:
        num = int(input("Please input a number: "))
        break
    except ValueError:
        print("Your input number is not valid, Try again")

以上实例中,当用户输入一个非数字的时候,会发出异常,如果发出的异常与except后的相符,此时会执行except的语句,如果没有出现异常或者异常不相符,则不会执行,一个except可以同时处理多个异常,通常放到()里,变成一个元组
except(RuntimeError, TypeError)
最后一个except语句可以不指定异常的名称,raise关键字显示引发异常的方法

try:
    print(int("hello"))
except RuntimeError:
    print("Value error")
except:
    print("Other error")
    raise

try..except语句还可以有一个else语句,如果使用这个语句,必须放在所有except之后,这个语句将在try语句没有发生任何情况下执行

try:
    print(int("1"))
except RuntimeError:
    print("Value error")
except:
    print("Other error")
    raise
else:
    print("ok")

使用else子句比把所有的语句都放在try子句里面要好,这样可以避免一些意想不到的、而except又没有捕获的异常

四、抛出异常

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

print(1)
raise ValueError("试试异常")

raise唯一的一个参数指定了要被抛出的异常信息。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的raise语句就可以再次把它抛出

五、自定义异常

通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,这个例子中,类Exceptio默认的__init__()被覆盖

class MyError(Exception):
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return repr(self.value)


try:
    raise MyError("自己的异常")
except MyError as e:
    print(e.value)

六、定义清理行为

try语句还有另外一个可选的子句,它定义了无论在任何情况下都会执行的清理行为,不管try子句里面有没有发生异常,finally子句都会执行

try:
    raise KeyboardInterrupt
finally:
    print("执行清理")

七、预定义的清理行为

一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行

for i in open("/Users/colin/PycharmProjects/demo/Test.txt"):
    print(i)

以上代码在读取完文件后,文件会一直保持打开状态,没有被关闭,如果想要使用完后一定会执行清理,可以修改为如下:

with open("/Users/colin/PycharmProjects/demo/Test.txt") as f:
    for i in f:
        print(i)

本文到此结束,如果发现有误可以在下方评论区留言哦

目录
相关文章
|
12天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
20天前
|
Python
【python从入门到精通】-- 第五战:函数大总结
【python从入门到精通】-- 第五战:函数大总结
56 0
|
13天前
|
存储 索引 Python
|
7天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第24天】本文将带你进入Python的世界,从最基础的语法开始,逐步深入到实际的项目应用。我们将一起探索Python的强大功能和灵活性,无论你是编程新手还是有经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python的奇妙之旅吧!
|
9天前
|
数据采集 存储 数据库
Python中实现简单爬虫的入门指南
【10月更文挑战第22天】本文将带你进入Python爬虫的世界,从基础概念到实战操作,一步步指导你如何使用Python编写一个简单的网络爬虫。我们将不展示代码示例,而是通过详细的步骤描述和逻辑讲解,帮助你理解爬虫的工作原理和开发过程。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你打开一扇通往数据收集新世界的大门。
|
7天前
|
测试技术 开发者 Python
探索Python中的装饰器:从入门到实践
【10月更文挑战第24天】 在Python的世界里,装饰器是一个既神秘又强大的工具。它们就像是程序的“隐形斗篷”,能在不改变原有代码结构的情况下,增加新的功能。本篇文章将带你走进装饰器的世界,从基础概念出发,通过实际例子,逐步深入到装饰器的高级应用,让你的代码更加优雅和高效。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往高效编程的大门。
|
9天前
|
存储 人工智能 数据挖掘
Python编程入门:构建你的第一个程序
【10月更文挑战第22天】编程,这个听起来高深莫测的词汇,实际上就像搭积木一样简单有趣。本文将带你走进Python的世界,用最浅显的语言和实例,让你轻松掌握编写第一个Python程序的方法。无论你是编程新手还是希望了解Python的爱好者,这篇文章都将是你的理想起点。让我们一起开始这段奇妙的编程之旅吧!
14 3
|
8天前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
机器学习基础:使用Python和Scikit-learn入门
20 1
|
10天前
|
存储 程序员 开发者
Python编程入门:从零开始掌握基础语法
【10月更文挑战第21天】本文将带你走进Python的世界,通过浅显易懂的语言和实例,让你快速了解并掌握Python的基础语法。无论你是编程新手还是想学习一门新的编程语言,这篇文章都将是你的不二之选。我们将一起探索变量、数据类型、运算符、控制结构、函数等基本概念,并通过实际代码示例加深理解。准备好了吗?让我们开始吧!
|
14天前
|
Python
Python生成器、装饰器、异常
【10月更文挑战第15天】