python_异常处理_try....except

 

如果你在写python程序时遇到异常后想进行如下处理的话,一般用try来处理异常,假设有下面的一段程序:

try :
     语句 1
     语句 2
     .
     .
     语句N
except  .........:
     do something .......


说明:

1.Python用异常对象(exception object)表示异常情况,遇到错误后,会引发异常。如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行。

2.try.....except捕捉异常,如果不抛出,则直接继续往下处理,raise 抛出异常,抛给上一层级处理

3.关于回溯(Traceback):就是将异常交给上一层使用者处理

4.raise相当于C#中的throw,用于抛出异常

1)add中有异常,无法处理,直接抛给main,main无法处理,交给os处理,os一般有异常时,直接终止程序,所以print('我被执行了')未被执行

  def  add():
    a = b + c
 
if  __name__ = = '__main__' :
    add()
    print ( '我被执行了' )

 

 

  def  add():
     try :
         a = b + c
     except  Exception as e:
         print (e)
 
if  __name__ = = '__main__' :
    add()
    print ( '我被执行了' )

 

 

3.add 中抛出异常,但是main中没有进程处理,异常交给os处理,

def  add():
     try :
         a = b + c
     except  Exception as e:
         print (e)
         raise
 
if  __name__ = = '__main__' :
    add()
    print ( '我被执行了' )

 

 

总结了一下3个方法:但是你并不知道"语句1至语句N"在执行会出什么样的异常,但你还要做异常处理,且想把出现的异常打印出来,并不停止程序的运行,所以在"except ......"这句应怎样来写呢?

方法一:捕获所有异常

try :
     a = b
     b = c
except  Exception as e:
     print  (Exception, ":" ,e)


方法二:采用traceback模块查看异常

#引入python中的traceback模块,跟踪错误
import  traceback 
try
     a =
     b =
except
     traceback.print_exc()

 

方法三:采用sys模块回溯最后的异常

#引入sys模块
import  sys 
try
     a =
     b =
except
     info = sys.exc_info() 
     print  (info[ 0 ], ":" ,info[ 1 ])

 

try except 语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后。这个子句将在try子句没有发生任何异常的时候执行。例如:

for  arg  in  sys.argv[ 1 :]:
     try :
         =  open (arg,  'r' )
     except  IOError:
         print ( 'cannot open' , arg)
     else :
         print (arg,  'has' len (f.readlines()),  'lines' )
         f.close()

 

finally子句

finally子句和try子句联合使用但是和except语句不同,finally不管try子句内部是否有异常发生,都会执行finally子句内的代码。所有一般情况下,finally自己常常用于关闭文件或者在Socket中。

try :
     print  2 / '0'
except  (ZeroDivisionError,Exception):
     print  '发生了一个异常'
finally :
     print  '不管是否发生异常都执行'

raise

Python 使用 raise 语句抛出一个指定的异常。例如:

raise  NameError( 'HiThere' )

 

raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。

如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。

 

 

try :
     raise  NameError( 'HiThere' )
except  NameError:
     print ( 'An exception flew by!' )
     raise
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值