我们虽然经常用到try...except 作为异常补货,但是其实很少去研究try源码和机制,也许点进去看过,也是看不出个所以然来

class Exception(BaseException):
    """ Common base class for all non-exit exceptions. """
    def __init__(self, *args, **kwargs): # real signature unknown
        pass

继承了BaseException

class BaseException(object):
    """ Common base class for all exceptions """
    def with_traceback(self, tb): # real signature unknown; restored from __doc__
        """
        Exception.with_traceback(tb) --
            set self.__traceback__ to tb and return self.
        """
        pass

    def __delattr__(self, *args, **kwargs): # real signature unknown
        """ Implement delattr(self, name). """
        pass

    def __getattribute__(self, *args, **kwargs): # real signature unknown
        """ Return getattr(self, name). """
        pass

    def __init__(self, *args, **kwargs): # real signature unknown
        pass
..................

 是不是仍然一脸懵逼,同感,哈哈,那还是直接上代码,事实大于雄辩

代码举例转自https://blog.csdn.net/u010159842/article/details/54924940 我觉得这个作者写的很清楚

一:在 try 中 raise一个异常,就立刻转入 except 中执行,在except 中遇到 return 时,就强制转到 finally 中执行, 在 finally 中遇到 return 时就返回,最终函数返回值是finally 返回的

ef test1():
   try:
      print('to do stuff')
      raise Exception('hehe')
      print('to return in try')
      return 'try'
 except Exception:
      print('process except')return 'except'
 finally:
      print('to return in finally')
      return 'finally'

test1Return = test1()
print('test1Return : ' + test1Return)
#输出:

#to do stuff
#process except
#to return in finally
#test1Return : finally

 

二:这里在 try 中没有抛出异常,因此不会转到 except 中,但是在try 中遇到return时,也会立即强制转到finally中执行,并在finally中返回

def test2():
   try:
      print('to do stuff')
      print('to return in try')
      return 'try'
 except Exception:
      print('process except')
      print('to return in except')
      return 'except'
 finally:
      print('to return in finally')
      return 'finally'

test2Return = test2()
print('test1Return : ' + test2Return)
#输出:
#to do stuff
#to return in try
#to return in finally
#test2Return : finally

 

test1和test2得到的结论:

无论是在try还是在except中,遇到return时,只要设定了finally语句,就会中断当前的return语句,跳转到finally中执行,如果finally中遇到return语句,就直接返回,不再跳转回try/excpet中被中断的return语句

def test3():
   i = 0
 try:
      i += 1
 print('i in try : %s'%i)
      raise Exception('hehe')
 except Exception:
      i += 1
 print('i in except : %s'%i)
      return i
      finally:
      i += 1
 print ('i in finally : %s'%i )

print('test3Return : %s'% test3())
#输出:

#i in try : 1
#i in except : 2
#i in finally : 3
#test3Return : 2

 

 

def test4():
   i = 0
 try:
      i += 1
 return i
   finally:
      i += 1
 print ('i in finally : %s'%i )
print('test4Return : %s' % test4())
#输出
#i in finally : 2
#test4Return : 1

 

test3和test4得到的结论:

在except和try中遇到return时,会锁定return的值,然后跳转到finally中,如果finally中没有return语句,则finally执行完毕之后仍返回原return点,将之前锁定的值返回(即finally中的动作不影响返回值),如果finally中有return语句,则执行finally中的return语句。

 

四:test5得到的结论:在一个循环中,最终要跳出循环之前,会先转到finally执行,执行完毕之后才开始下一轮循环

def test5():
   for i in range(5):
      try:
         print('do stuff %s'%i)
         raise Exception(i)
      except Exception:
         print('exception %s'%i)
         continue
 finally:
         print('do finally %s'%i)
test5()
输出

do stuff 0
exception 0
do finally 0
do stuff 1
exception 1
do finally 1
do stuff 2
exception 2
do finally 2
do stuff 3
exception 3
do finally 3
do stuff 4
exception 4
do finally 4
View Code

相关文章:

  • 2022-12-23
  • 2021-09-06
  • 2021-06-28
  • 2022-12-23
  • 2019-02-25
  • 2021-07-24
  • 2021-10-14
  • 2022-12-23
猜你喜欢
  • 2021-07-31
  • 2022-01-19
  • 2021-10-27
  • 2022-02-06
  • 2021-11-07
  • 2021-09-27
  • 2021-11-02
相关资源
相似解决方案