python的异常处理

python的try语句有两种风格
一:种是处理异常(try/except/else)
二:种是无论是否发生异常都将执行最后的代码(try/finally)

try/except/else风格
try:
<语句> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生
try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
1、如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
2、如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
3、如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。

与Python异常相关的关键字:
关键字          关键字说明
raise           抛出/引发异常
try/except      捕获异常并处理
pass            忽略异常
as              定义异常实例(except IOError as e)
finally         无论是否出现异常,都执行的代码
else            如果try中的语句没有引发异常,则执行else中的语句
except
   老版本的Python,except语句写作"except Exception, e",Python 2.6后应写作"except Exception as e"。
使用
except
而不带任何异常类型:
try:

do something

except:

handle except

    会捕获所有异常,包括键盘中断和程序退出请求(用sys.exit()就无法退出程序了,因为异常被捕获了),因此慎用。
使用
except Exception as e
可以捕获除与程序退出sys.exit()相关之外的所有异常

 


try/finally风格
try:
<语句>
finally:
<语句> #退出try时总会执行

python总会执行finally子句,无论try子句执行时是否发一异常。
1、如果没有发生异常,python运行try子句,然后是finally子句,然后继续。
2、如果在try子句发生了异常,python就会回来执行finally子句,然后把异常递交给上层try,控制流不会通过整个try语句。
当你想无论是否发生异常都确保执行某些代码时,try/finally是有用的。

这个在打开文件的时候有用 finally总是在最后close()文件

try语句子句形式表
except: 捕获所有异常
except name: 只捕获特定的异常
except name,value: 捕获异常和它的附加数据(将异常的信息保存到value,)
except (name1,name2): 捕获任何列出的异常
else: 如果没有异常
finally: 总是执行

>>> try:
f = open('file.txt')
except IOError, e:
print e
else:
print 'wrong'

[Errno 2] No such file or directory: 'file.txt'
最新的python版本 支持try/except/finally
try: 1:如果x没有异常,执行z,i
x 2:如果x有异常, 一:如果except捕捉到异常则执行y,i
except(name): 二:没捕捉到,执行i,然后返回内置异常处理
y
else:
z
finally:
i

但是,不知道"语句1至语句N"在执行会出什么样的异常,还要做异常处理,且想把出现的异常打印出来,并不停止程序的运行,所以在"except ......"这句应怎样来写呢?
总结了一下至少3个方法:
方法一:捕获所有异常
try:
a=b
b=c
except Exception,e:
print Exception,":",e
try:
a=b
b=c
except Exception,e:
print Exception,":",e
www.2cto.com
方法二:采用traceback模块查看异常
import traceback
try:
a=b
b=c
except:
traceback.print_exc()
import traceback
try:
a=b
b=c
except:
traceback.print_exc()
方法三:采用sys模块回溯最后的异常
import sys
try:
a=b
b=c
except:
info=sys.exc_info()
print info[0],":",info[1]
import sys
try:
a=b
b=c
except:
info=sys.exc_info()
print info[0],":",info[1]
但是,如果你还想把这些异常保存到一个日志文件中,来分析这些异常,那么请看下面的方法:
把 traceback.print_exc() 打印在屏幕上的信息保存到一个文本文件中
try:
a=b
b=c
except:
f=open("c:log.txt",'a')
traceback.print_exc(file=f)
f.flush()
f.close()

 

引发异常

你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个ErrorException类的直接或间接导出类:

#!/usr/bin/python
# Filename: raising.py


class ShortInputException(Exception):
   '''A user-defined exception class.'''
   def __init__(self, length, atleast):
   Exception.__init__(self)
   self.length = length
   self.atleast = atleast


try:
   s =
raw_input('Enter something --> ')
   if len(s) < 3:
   raise ShortInputException(
len(s), 3)
   # Other work can continue as usual here
except EOFError:
   print '\nWhy did you do an EOF on me?'
except ShortInputException, x:
   print 'ShortInputException: The input was of length %d, \
   was expecting at least %d'
% (x.length, x.atleast)
else:
   print 'No exception was raised.'


如何工作:我们创建了异常类型(可以使用任何预定义的异常/错误),这个新的异常类型是ShortInputException类。它有两个域——length是给定输入的长度,atleast则是程序期望的最小长度。

except从句中,我们提供了错误类和用来表示错误/异常对象的变量。这与函数调用中的形参和实参概念类似。在这个特别的except从句中,我们使用异常对象的lengthatleast域来为用户打印一个恰当的消息。

 

转载于:https://www.cnblogs.com/cl1024cl/p/6205627.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决SQL单用户模式不能转为多用户模式

数据库CS 转为单用户模式后&#xff0c;却不能访问属性&#xff0c;一直想不通&#xff0c;但毕竟是测试用的&#xff0c;也就没放心上。网上找到段代码可以恢复多用户模式。却还是不能解决不能访问单用户属性的问题。USE master;GoDECLARE SQL VARCHAR(MAX);SET SQLSELECT SQL…

C++ stringstream介绍,使用方法与例子

C引入了ostringstream、istringstream、stringstream这三个类&#xff0c;要使用他们创建对象就必须包含sstream.h头文件。   istringstream类用于执行C风格的串流的输入操作。 ostringstream类用于执行C风格的串流的输出操作。 strstream类同时可以支持C风格的串流的输入…

xp下添加linux启动,如何在windows xp系统下安装linux???

我刚刚想开始学linux&#xff0c;请教如何安装&#xff01;|我今天才安装了Redhat 9.0。LINUX不可能在WINDOWS下安装。比较简单的方法是先在XP下用PQMAGIC分好区boot ext3 100M , / ext3 6G , swap 内存1&#xff0d;2倍详细见www.linuxfans.org linux安装说明最后&#xf…

linux rar安装

描述&#xff1a;Linux默认自带ZIP压缩&#xff0c;最大支持4GB压缩&#xff0c;RAR的压缩比大于4GB. 流程&#xff1a;下载 》安装 》 使用 -------------------------------------------------- 下载 # wget http://www.rarsoft.com/rar/rarlinux-x64-5.2.1b1.tar.gz--16:01:…

hoj 2739 中国邮局问题

1 /*若原图的基图不连通,2 或者存在某个点的入度或出度为 0 则无解。3 统计所有点的入度出度之差 Di, 对于 Di > 0 的点,4 加边(s, i, Di, 0); 对于 Di < 0 的点加边(i, t, -Di,0);5 对原图中的每条边(i, j),6 在网络中加边(i, j, ∞, Dij),Dij 为边(i, j)的权值。7 求一…

R语言编程艺术(3)R语言编程基础

本文对应《R语言编程艺术》 第7章&#xff1a;R语言编程结构&#xff1b; 第9章&#xff1a;面向对象的编程&#xff1b; 第13章&#xff1a;调试 R语言编程结构 控制语句&#xff1a; 循环&#xff1a; for (n in x) { } while (condition) { } repeat { }另外break也可以用在…

用C++流成员函数put输出单个字符

转载&#xff1a;http://c.biancheng.net/cpp/biancheng/view/254.html 在程序中一般用cout和插入运算符“<<”实现输出&#xff0c;cout流在内存中有相应的缓冲区。有时用户还有特殊的输出要求&#xff0c;例如只输出一个字符。ostream类除了提供上面介绍过的用于格式控…

linux 扩充db2表空间,如何扩充db2的表空间、加容器等表空间维护操作

db2 "alter tablespace GJDATA resize (FILE /backup/GJDATA32K45G)"db2 "alter tablespace GJIDX resize (FILE /backup/GJIDX32K45G)"容器路径 db2 list tablespace containers for8容器大小 db2pd -d uibsch -tablespaces降低容器空间 resize 增加容器…

CheckBox控件

前台代码&#xff1a; 1 <asp:CheckBox ID"CheckBox1" runat"server" Text "苹果"/> 2 <asp:CheckBox ID"CheckBox2" runat"server" Text "柠檬"/> 3 <asp:CheckBox ID"CheckBox3" runa…

.NET垃圾回收笔记

名词 垃圾收集目标 ephemeral GC发生在Gen 0 和Gen 1 的垃圾收集 Full GC发生Gen 2 及以上的Gen与LOH的垃圾收集 垃圾收集模式 工作站模式GC直接发生在内存分配的线程&#xff08;也是当前的工作托管线程&#xff09;上 服务器模式每个CPU核都有一个自己独立的GC线程与托管堆 垃…

go.js中的图标(icons)的使用

2019独角兽企业重金招聘Python工程师标准>>> 1、图标库下载&#xff1a; 将icons引入&#xff1a;http://gojs.net/latest/samples/icons.js 2、样式演示 地址&#xff1a;http://gojs.net/latest/samples/icons.html 转载于:https://my.oschina.net/u/2391658/blog…

Pygame - Python游戏编程入门(1)

前言 在上一篇中&#xff0c;我们初步熟悉了pygame的控制流程&#xff0c;但这对于一个游戏而言是远远不够的。所以在这一篇中&#xff0c;我们的任务是添加一架飞机&#xff08;玩家&#xff09;&#xff0c;并且能够控制它进行移动&#xff0c;这样我们就又离目标进了一步了~…

C++字符输入getchar()和字符输出putchar()

转载&#xff1a;http://c.biancheng.net/cpp/biancheng/view/117.html C还保留了C语言中用于输入和输出单个字符的函数&#xff0c;使用很方便。其中最常用的有getchar函数和putchar函数。 putchar函数(字符输出函数) putchar函数的作用是向终端输出一个字符。例如&#xf…

linux实现shell,linux

4.5Mhttp://www.starbase-929.net/media/Calibre%20Library/Ken%20O.%20Bartch/Linux%20Shell%20Scription%20With%20Bash%20(1778)/Linux%20Shell%20Scription%20With%20Bash%20-%20Ken%20O.%20Bartch.pdfstarbase-929.net全网免费4.0Mhttp://www.myaitcampus.net/elibrary/im…

AQS浅析

2019独角兽企业重金招聘Python工程师标准>>> AQS的原理浅析 本文是《Java特种兵》的样章&#xff0c;本书即将由工业出版社出版 AQS的全称为&#xff08;AbstractQueuedSynchronizer&#xff09;&#xff0c;这个类也是在java.util.concurrent.locks下面。这个类似乎…

str045漏洞提权linux,Linux运维知识之CVE-2016-5195 Dirtycow: Linux内核提权漏洞

本文主要向大家介Linux运维知识之CVE-2016-5195 Dirtycow&#xff1a; Linux内核提权漏洞绍了&#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习Linux运维知识有所帮助。CVE-2016-5195 Dirtycow&#xff1a; Linux内核提权漏洞以下都是github上找的源码&#xf…

编程如写作

昨晚似乎是个适合写作的夜&#xff0c;不论是自己还是朋友&#xff0c;都比平常更容易被触动。看着微博上朋友们的心路&#xff0c;想写点什么却似乎找不出非常值得大书特书的主题&#xff0c;只是歪坐在电脑旁&#xff0c;喝着咖啡&#xff0c;单曲循环着仓木麻衣的《time aft…

C++中cin、cin.get()、cin.getline()、getline()等函数的用法

转载&#xff1a;http://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html c输入流函数主要以下几个&#xff1a; 1、cin 2、cin.get() 3、cin.getline() 4、getline() 附:cin.ignore();cin.get()//跳过一个字符,例如不想要的回车,空格等字符 1、cin>>…

工作环境总结(1)开发环境搭建

1、安装git 安装文件&#xff1a;Git-2.12.0-64-bit.exe 下载地址&#xff1a;https://github.com/git-for-windows/git/releases/download/v2.12.0.windows.1/Git-2.12.0-64-bit.exe 在git bash中配置&#xff0c;git bash命令行中执行&#xff08;只有使用到egit时使用&…

c语言烟花百度云,C语言实现放烟花的程序

这是一个利用C语言编写放烟花的程序(同时也可以播放音乐)&#xff0c;供大家参考&#xff0c;具体内容如下代码如下#pragma once#include#include //图形界面库头文件#include //计算圆形的轨迹坐标#include#include#include#include#pragma comment(lib,"winmm.lib"…