Chinaunix首页 | 论坛 | 博客
  • 博客访问: 149132
  • 博文数量: 51
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2020-12-30 16:49
文章分类
文章存档

2021年(48)

2020年(3)

我的朋友

分类: Python/Ruby

2021-01-05 18:54:55



### 错误与异常


#### 1、区分错误与异常


**两种错误(都必须改正):** 语法错误(代码不规范,格式不对或缺少符号)、逻辑错误(逻辑不通)
**异常:** 程序运行时发生错误的信号


#### 2、异常处理与注意事项


**异常处理:** 程序员特意去捕捉异常,如果捕捉成功,就进入另外一段你定义的逻辑里去运行,使程序不会崩溃


**注意:** 异常处理的逻辑应该是与程序的主逻辑的分离开的;根本不会有人去用运行到一半就崩溃的软件,所以我们必须提供一种异常处理机制来增强我们程序的健壮性和容错性


>本期推送整理了初学者可能会用到的Python资料,含有书籍/视频/在线文档和编辑器/源
代码,关于`Python`的安装qun:850973621




### 各种异常


#### 1、常见异常


> **AttributeError** 试图访问一个对象没有的属性,比如test.a,但是test没有属性a
> **IOError** 输入/输出异常;基本上就是无法打开文件
> **ImportError** 无法引入模块或包;基本上就是路径问题或名称错误
> **IndentationError** 语法错误(的子类) ;代码没有正确缩进或对齐
> **IndexError** 下标索引超出序列边界,比如当a只有三个元素,却试图访问a[5]
> **KeyError** 键异常,试图访问字典里不存在的键
> **KeyboardInterrupt** Ctrl+C被按下
> **NameError** 使用一个还未被赋予对象的变量
> **SyntaxError** Python代码非法,代码不能编译(基本上就是语法错误)
> **TypeError** 传入对象类型与要求的不符合
> **UnboundLocalError** 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
> **ValueError** 值异常,传入一个调用者不期望的值,即使值的类型是正确的


#### 2、其他异常


> ArithmeticError
> AssertionError
> AttributeError
> BaseException
> BufferError
> BytesWarning
> DeprecationWarning
> EnvironmentError
> EOFError
> Exception
> FloatingPointError
> FutureWarning
> GeneratorExit
> ImportError
> ImportWarning
> IndentationError
> IndexError
> IOError
> KeyboardInterrupt
> KeyError
> LookupError
> MemoryError
> NameError
> NotImplementedError
> OSError
> OverflowError
> PendingDeprecationWarning
> ReferenceError
> RuntimeError
> RuntimeWarning
> StandardError
> StopIteration
> SyntaxError
> SyntaxWarning
> SystemError
> SystemExit
> TabError
> TypeError
> UnboundLocalError
> UnicodeDecodeError
> UnicodeEncodeError
> UnicodeError
> UnicodeTranslateError
> UnicodeWarning
> UserWarning
> ValueError
> Warning
> ZeroDivisionError


这些异常都比较少见,所以也没有必要全部列出来是哪方面的异常,太多了也记不住,所以可以遇到再去搜索这些少见的异常的解决方案


### 异常处理


#### 1、if判断式


```
while True:
    cou = input('请输入你的账号:\n')
    if cou.isdigit():  #主逻辑,如果全是数字才执行转换int格式操作
        int(cou)
        break
    #下面几个就为异常准备的逻辑,在写程序时就应该考虑到各种可能出现的异常
    elif cou.isspace():  
        print('账号内不应有空格,请重新输入')
        continue
    elif len(cou)==0:
        print('您输入的长度为0,请重新输入')
    elif cou.isalpha():
        print('账号内不应有字母,请重新输入')
    else:
        print('输入内有其他非法输入,请重新输入')
123456789101112131415
复制代码
```


运行结果:
[图片上传中...(image-b3cf8c-1609843930718-3)]


**if判断式的缺点:** 只能针对某一段代码,对于不同的代码段的相同错误类型需需要写重复的if来进行处理,显得非常赘余,可读性极其差


#### 2、try … except …异常处理


```
while True:
    try:  #主逻辑
        cou = input('请输入数字:\n')
        int(cou)


        cou2 = input('请再输入数字:\n')
        int(cou2)


    except ValueError as e:
        #ValueError是异常类型,表示如果出现值的异常,就执行except下的逻辑
        print(e,'请重新输入')
    except KeyError as e:  #如果出现键的异常
        print(e,'请重新输入')
    except IndexError as e:  #如果出现语法异常
        print(e,'请重新输入')
    except Exception as e:  #如果出现其他异常
        print(e,'请重新输入')


    else:
        print('try内的代码没有异常就执行else')  #没有异常就会执行else的内容


    finally:
        print('无论try中有无异常,finally都会执行')
        break  #常用来做清理内存操作,或者跳出循环
123456789101112131415161718192021222324
复制代码
```


运行结果:
[图片上传中...(image-d0745a-1609843930718-2)]


#### 3、主动异常


```
name = 'ViewIn'
try:
    raise TypeError('类型错误')  #用raise主动触发异常
except Exception as e:
    print(e)
12345
复制代码
```


运行结果:
[图片上传中...(image-6e23f3-1609843930718-1)]


#### 4、断言


```
print('---------------------------line1')
assert 1 == 1
print('===========================line2')  #如果assert的表达式成立,则继续执行,否则程序终止


#相当于
if 1 != 2:
    raise AssertionError  #主动抛出一个异常


#断言后面有一万行代码
123456789
复制代码
```


运行结果:


![image.png](https://upload-images.jianshu.io/upload_images/25205170-85219c5ae86d625e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)










原文链接:
阅读(16997) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~