<span>Python - 错误和异常 </span>

语法错误

错误一般就是指语法错误,也是解析错误;通常在IDE已经会提醒有语法错误了

while True
    print("test")

执行结果

  File "C:/异常.py", line 11
    while True
             ^
SyntaxError: invalid syntax

解析器会报错,直接指向语法有错的地方

 

重点!异常

描述:异常一般在ide无法直接检测出来,在我们执行到代码语句时,若有异常则会自动抛出

 

内置异常

BaseException

  • 所有内置异常的基类
  • 需要自定义异常类的时候不能继承它

 

Exception

  • 所有内置的非系统退出类异常都继承自此类
  • 所有自定义异常类都应该继承此类

 

ArithmeticError

各种算术类错误而引发的内置异常: OverflowError, ZeroDivisionError, FloatingPointError

 

LookupError

当映射或序列所使用的的键或索引无效时引发的异常:IndexError、KeyError,都是继承该类

 

常见的具体内置异常

均是Exception的子类

AssertionError:assert断言失败时引发

AttributeError:属性引用(如: 实例对象.方法 )失败或赋值失败(如: 对象=值 )

ImportError:加载模块失败时引发,如: from list import test ,若找不到test则报此异常

ModuleNotFoundError:当一个模块找不到时引发,如: import testss ,testss不存在则报此异常;是ImportError的子类

IndexError:取序列索引超出范围

KeyError:在字典中找不到指定的Key

TypeError:当一个操作或函数被应用于类型不适当的对象时将被引发,传入参数的类型错误(如:传了string给一个int类型的参数)

ValueError:当传入的参数类型正确,但值不正确时引发(如:传入要求范围之外的数值)

UnicodeEncodeError:编码错误

UnicodeDecodeError:解码错误

OSError:调用操作系统函数时报错引发该异常,一般是I/O操作

 

OS 异常

以下所有异常都是OSError的子类

FileExistsError:文件已存在(如:创建一个文件)

FileNotFoundError:文件找不到(如:open一个文件)

PermissionError:没有权限操作文件(如:写入内容到一个正在打开的文件)

IsADirectoryError:对目录进行文件操作(如:os.remove() 传入目录路径)

NotADirectoryError:对文件进行目录操作(如:os.listdir() 传入文件路径)

 

警报

部分异常只是当做警告类别

DeprecationWarning:过时,已被弃用的特性相关警告

 

Python中处理异常

try:
    x = int(input("Please enter a number: "))
    x.open()
    print("继续执行try")
except AttributeError:
    print("AttributeError")
except ValueError:
    print("ValueError")

try语句的工作原理

  • 首先,执行  try 子句

  • 如果没有异常发生,则不执行  except 里面的代码,并执行  try 里面剩下的代码。

  • 如果在执行 try 里面代码时发生了异常,则不再执行剩下代码,如果抛出异常的类型和  except 的异常类匹配,则执行  except 里面的代码

  • 如果抛出的异常没有被 except 的异常类匹配上,则直接抛出原生异常,在控制台打印

 

多个except和else

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
else:
    print("没异常才执行")

执行结果

# 若找不到myfile.txt
OS error: [Errno 2] No such file or directory: 'myfile.txt'

# 若找到文件了,但里面包含字母
Could not convert data to an integer.

# 其他异常
Unexpected error:

知识点

  • 最后一个 except 不指定异常类时,可以作为通配符,若前面所有异常类都没有匹配上,则会自动匹配这个 except ,并执行里面代码,注意:最好要raise一下,否则不知道异常是什么
  • 如果写 else 必须放在所有 except 后面
  • else 的作用:当try里面的代码没有异常时就执行else里面的代码,可以理解成: try 里面写有可能发生异常的代码块,而 else 里面写若无异常则正常执行的代码块

 

try、else里面的return优先级

def test1():
    while True:
        try:
            print("没异常的print")
            return "try"
        except ValueError:
            print("Could not convert data to an integer.")
        else:
            print("没异常才执行")
            return "else"

print(test1())

执行结果

没异常的print
try

知识点

try、else里面都有 return 代码时,会优先执行try里面的,且不再执行else里面所有代码

 

finally

while True:
    try:
        print("没异常的print")
        break
    except ValueError:
        print("Could not convert data to an integer.")
    else:
        print("没异常才执行")
    finally:
        print("无论是否报异常都会执行")

执行结果

没异常的print
没异常才执行
无论是否报异常都会执行

知识点

  • finally 的代码块,无论是否报异常都会执行
  • finally的作用:一般写清理关闭操作,如:关闭文件、关闭数据库连接等等
  • 若没有 break 、 continue 、 return 、异常,执行顺序是:try - else - finally
  • try 里面有 break 、 continue 、 return ,在执行 break 、 continue 、 return 前也得执行 finally 代码块,且不执行 else 代码块
  • 若 try 和 finally 里面都有 return ,则优先执行 finally 的 return ,如下代码
def test2():
    try:
        print("没异常的print")
        return "try"
    except ValueError:
        print("Could not convert data to an integer.")
    finally:
        print("无论是否报异常都会执行")
        return "finally"

print(test2())

执行结果

没异常的print
无论是否报异常都会执行
finally

 

 
全部评论

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
千千倩倩:简历问题有点多,加v细聊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务