python错误和异常

常见异常:
1、语法错误(Syntax Errors)
语法错误,也就是解析时错误。当我们写出不符合python语法代码时,在解析时会报SyntaxError,并且会显示出错的那一行,并用小箭头知名指明最早探测到错误的位置。如:

>>> while Ture
  File "<stdin>", line 1
    while Ture
             ^
SyntaxError: invalid syntax

2、异常(Exceptios)
即使语句或表达式在语法上是正确的,但在尝试运行时也可能发生错误,运行时错误就叫做异常(Exceptions)。异常并不是致命的问题,因为我们可以在程序中对异常进行处理。

>>> 10 * (1 / 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

>>> 2 + x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

>>> 2 + '2'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

上面显示了三种Exceptions的类型:ZeroDivisionError,NameError,TypeError,它们都是内置异常的名称。标准异常的名字就是内建的标识符(但并不是关键字)。

处理异常(try…except…)
我们可以使用try…except…语句来处理异常。try语句块中是要执行的语句,except语句块中是异常处理语句。一个try语句可以有多个except语句,用以指定不同的异常,但至多只有一个会被执行。

try:
    x = int(input('please input a integer:'))
    if 30 / x >5:
        print("Hello world!")
except ValueError:
    print('That was no valid number .Try again...')
except ZeroDivisionError:
    print("The divior can not be zero .Try again...")
except:
    print("Handling other exceptions...")

上面这段代码,当输入a(非数字)时,将抛出ValueError;
当输入0时,将抛出ZeroDivisionError;
当输入其他类型的异常时,将执行except:后的处理语句。
如果在try执行时 ,出现了一个异常,该语句剩下部分将被跳过。并且如果该异常的类型匹配到了except后面的异常名,那么该except后的语句将被执行。注意如果except后面没有跟异常名,表示匹配任何类型的异常,except:必须放在最后。
一个except可以同时包括多个异常名,但需要用括号括起来,如:

>>> try:
...     a = input()
... except (Runtime,TypeError,NameError):
...     print("exception")

try…except…语句还可以有一个可选的else语句,else语句必须放在所有except语句之后,当没有异常发生的时候,else从句将被执行。

抛出异常
raise允许程序员强制地抛出一个特定的异常,例如:

>>> raise NameError #抛出异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError

raise抛出的异常必须是一个异常实例或类(派生自Exception的类)

>>> try:
...     raise NameError('HiThere')
... except NameError:
...     print('An exception flew by!')
...     raise

...
An exception flew by!
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
NameError: HiThere

清理动作(finally)
try语句有另一种可选的finally从句,用于自定义一些扫尾清理工作。
与 else 从句的区别在于: else 语句只在没有异常发生的情况下执行,而 finally 语句则不管异常发生与否都会执行。准确的说,finally 语句总是在退出 try 语句前被执行,无论是正常退出、异常退出,还是通过break、continue、return退出。

try:
… raise KeyboardInterrupt
… finally:
… print(‘Goodbye, world!’)

Goodbye, world!
Traceback (most recent call last):
File “”, line 2, in
KeyboardInterrupt

目标

请在 /home/shiyanlou/Code写出一个 MinutesToHours.py 脚本文件,实现一个函数 Hours(),将用户输入的 分钟数 转化为 小时数和分钟数,并要求小时数尽量大。讲结果以 XX H, XX M 的形式打印出来。(注意打印格式中的空格)

要求

用户能够通过命令行输入分钟数,程序需要打印出相应的小时数和分钟数
如果用户输入的是一个负值,程序需要报错 ValueError
需要进行 try…except 操作来控制异常。如果异常,在屏幕上打印打印出 ValueError: Input number cannot be negative 提示用户输入的值有误

代码如下

#!/usr/bin/env python3
import sys
def Hours(m):
    H,M = divmod(m,60) #得到一个商和余数的元组
    return '{} H, {} M'.format(H,M)
try:
    m = int(sys.argv[1]) #传入的第一个参数
    if m < 0:
        raise ValueError
    else:
        print(Hours(m))
except ValueError:
    print('ValueError: Input number cannot be negative' )

错误
程序错误,主要分为三类:

语法错误
逻辑错误
运行时错误

语法错误
语法错误(也称:解析错误):是指不遵循语言的语法结构引起的错误(程序无法正常编译/运行)。

在编译语言(例如:C++)中,语法错误只在编译期出现,编译器要求所有的语法都正确,才能正常编译。不过对于直译语言(例如:Python)来说,语法错误可能在运行期才会出现,而且不太容易区分语法错误及语义错误。

常见的 Python 语法错误有:

遗漏了某些必要的符号(冒号、逗号或括号)
关键字拼写错误
缩进不正确
空语句块(需要用 pass 语句)
例如,编写这样一个条件判断语句:

if n < 5
File “”, line 1
if n < 5
^
SyntaxError: invalid syntax

由于 if 语句中缺少一个冒号(:),不符合 Python 语法,因此程序无法正常运行。

逻辑错误
逻辑错误(也称:语义错误):是指程序的执行结果与预期不符(程序可以正常运行,不会 Crash)。

与语法错误不同的是,逻辑错误从语法上来说是正确的,但会产生意外的输出或结果,并不一定会被立即发现。逻辑错误的唯一表现就是错误的运行结果。

常见的逻辑错误有:

运算符优先级考虑不周
变量名使用不正确
语句块缩进层次不对
在布尔表达式中出错
例如,要计算两个数的平均值:

def average(a, b):
… return a + b / 2 # 应为 (a + b) / 2

虽然程序能够正常运行,但代码中缺少括号,由于运算符优先级(先乘除,后加减)的缘故,运算结果并不正确。

运行时错误
运行时错误:是指程序可以运行,但是在运行过程中遇到错误,导致意外退出。

当程序由于运行时错误而停止时,通常会说程序崩溃了。在 Python 中,这种运行时错误被称为异常。

Python 中的一些运行时错误:

使用未定义的标识符(NameError)
除数为 0(ZeroDivisionError)
打开的文件不存在(FileNotFoundError)
导入的模块没被找到(ImportError)
例如,除数为 0:

5 / 0
Traceback (most recent call last):
File “”, line 1, in
ZeroDivisionError: division by zero

每当出现这类运行时错误时,Python 就会创建一个异常对象。如果处理不当,会输出一个跟踪(Traceback)到那个错误,以及关于为什么会出现错误的一些细节。

python raise 触发异常

import pandas as pd #没有pandas库的pip install pandas 安装一下
import webbrowser
def mye(level):
    if level < 1:
        raise Exception("Invalid level!",level) #强制触发异常,并传入两个参数
        # 触发异常后,后面的代码就不会再执行
if __name__ == "__main__":
    # print(1/0) #ZeroDivisionError: division by zero
    # mye(0) #Exception: ('Invalid level!', 0)
    try:
        a = 1/ 0
    except ZeroDivisionError as ze:
        print(type(ze))  #<class 'ZeroDivisionError'>
        print(ze.args)#('division by zero',) 元祖
        print(ze)#division by zero
    try:
        mye(0)
    except Exception as e:
        print(type(e)) # 异常实例
        print(e) #异常参数
        print(e.args) #异常参数
        print(1)
    else:
        print(2)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值