Python: 异常处理

1. 扑获异常

1.1 基本语法

把可能抛出异常(出错)的语句放在tryblock里,然后用except去扑捉(预判)可能的异常类型,如果异常类型match,就执行except模块。

try:
    # write some code
    # that might throw exception
except <ExceptionType>:
    # Exception handler, alert the user

比如读取一个不存在的文件会引起IOError,我们就可以提前加以处理。

try:
    f = open('nofile.txt', 'r')
    print f.read()
    f.close()
except IOError:
    print 'file not found'
file not found

执行流程是这样的:

  1. First statement between try and except block are executed.
  2. If no exception occurs then code under except clause will be skipped.
  3. If file don’t exists then exception will be raised and the rest of the code in the try block will be skipped
  4. When exceptions occurs, if the exception type matches exception name after except keyword, then the code in that except clause is executed.

1.2 扑获更多异常类型

try:
    <body>
except <ExceptionType1>:
    <handler1>
except <ExceptionTypeN>:
    <handlerN>
except:
    <handlerExcept>
else:
    <process_else>
finally:
    <process_finally>
  1. except类似于elif,当try出现异常时,挨个匹配except里的异常类型,如果匹配,执行;若果没有匹配,执行不指定异常类型的except
  2. else只有在try执行时没有异常的时候执行。
  3. finally不管try模块是否有异常抛出,都执行。

1.3 例子

num1, num2 = 1,0
try:
    result = num1 / num2
    print("Result is", result)

except ZeroDivisionError:
    print("Division by zero is error !!")

except:
    print("Wrong input")

else:
    print("No exceptions")

finally:
    print("This will execute no matter what you input")
Division by zero is error !!
This will execute no matter what you input

2. 抛出异常

raise语句抛出自己的异常。raise ExceptionClass('Your argument')

def enterage(age):
    if age < 0:
        raise ValueError("Only positive integers are allowed")

    if age % 2 == 0:
        print("age is even")

try:
    num = int(input("Enter your age: "))
    enterage(num)
except ValueError:
    print 'Only positive integers are allowd'
except:
    print 'Something went wrong'
Enter your age: -3
Only positive integers are allowd

异常参考图,更多异常类型参见官方文档

exception

3. 操作异常

有时候我们希望能把异常对象传递给一个变量,也非常方便实现。

try:
    # this code is expected to throw exception
except ExceptionType as ex:
    # code to handle exception
try:
    number = int(input("Enter a number: "))
    print "The number entered is", number

except NameError as ex:
    print "Exception:", ex
Enter a number: one
Exception: name 'one' is not defined

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

Android热补丁技术—dexposed原理简析(手机淘宝采用方案)

上篇文章《Android无线开发的几种常用技术》我们介绍了几种android移动应用开发中的常用技术,其中的热补丁正在被越来越多的开发团队所使用,它涉及到da...

2456
来自专栏Python爬虫与算法进阶

PEP8规则及Pycharm应用

PEP8 PEP是 Python Enhancement Proposal 的缩写,翻译过来就是 Python增强建议书 PEP8 是什么呢,简单说就是一种编码...

3865
来自专栏xingoo, 一个梦想做发明家的程序员

AngularJS API之copy深拷贝

angular提供了一个可以复制对象的api——copy(source,destination),它会对source对象执行深拷贝。 使用时需要注意下面几...

2106
来自专栏Java面试通关手册

可能是把Java内存区域讲的最清楚的一篇文章

哈哈 皮一下!我自己开源的一个Java学习指南文档。一份涵盖大部分Java程序员所需要掌握的核心知识,正在一步一步慢慢完善,期待您的参与。Github地址:ht...

762
来自专栏企鹅号快讯

Python异常

一.Python的运行时错误称作异常 语法错误:软件的结构上有错误而导致不能被解释器解释或不能被编译器编译 逻辑错误:由于不完整或不合法的输入所致,也可能是逻辑...

2069
来自专栏Python攻城狮

常见编码问题UnicodeEncodeError

python 里面的编码和解码也就是 unicode 和 str 这两种形式的相互转化。编码是 unicode -> str,相反的,解码就是 str -> u...

622
来自专栏ImportSource

JDK11中增加了一个常量池类型:CONSTANT_Dynamic

有关class file 的内容,这里不再赘述。你可以参阅此文:来自JVM的一封ClassFile介绍信。

1371
来自专栏专注 Java 基础分享

深入理解Struts2----类型转换

     之前的一系列文章主要介绍了有关Struts2的一些基本用法和部分的简单原理,但是始终没有介绍有关拦截器的相关内容,从本篇开始我们将从另一个角度去深入理...

2159
来自专栏自学笔记

python基本常识

tuple,str都可以看做是一种list,都可以进行切片操作。 利用切片操作,去掉一个字符串的前后空格。要注意是是前后空格是不止一个的,可能有很多个。

2325
来自专栏技术/开源

从C#到TypeScript - Promise

从C#到TypeScript - Promise 背景 相信之前用过JavaScript的朋友都碰到过异步回调地狱(callback hell),N多个回调的嵌...

2018

扫码关注云+社区