美文网首页Learning Python
Chapter 33: Exception Basics

Chapter 33: Exception Basics

作者: 枇杷膏_a56b | 来源:发表于2021-06-19 22:09 被阅读0次

Exception statements

  • try/except
    Catch and recover from exceptions raised by Python.
  • try/finally
    Perform cleanup actions, whether exceptions occur or not.
  • raise
    Trigger an exception manually in your code.
  • assert
    Conditionally trigger an exception in your code.
  • with/as
    implement context managers in Python 2.6, 3.0, and later.

Exceptions: The short story

Default Exception Handler

def fetcher(obj, index):
    return obj[index] 

x = 'spam'
fetcher(x, 3  )
>out:
'm'

# Trigger error
fetcher(x, 4) 

>out:
IndexError                                Traceback (most recent call last)
<ipython-input-2-21dabc2ad673> in <module>
----> 1 fetcher(x, 4)

<ipython-input-1-cda73fc8bc2e> in fetcher(obj, index)
      1 def fetcher(obj, index):
----> 2     return obj[index]
      3 
      4 
      5 x = 'spam'

IndexError: string index out of range

Catching Exceptions

try:
    fetcher(x, 4)
except IndexError:
    print('got exception') 

>out:
got exception
  • try statements can recover from the error
try:
    fetcher(x, 4)
except IndexError:
    print('got exception') 
print('continuing') 

>>>
got exception
continuing

Raising Exceptions

  • Trigger the exceptions directly
try:
    raise IndexError
except IndexError:
    print('got exception') 

>>>
got exception
  • raize can trigger default error handler if it is not been caught
raise IndexError 

>>>
IndexError                                Traceback (most recent call last)
<ipython-input-7-685a1d98d309> in <module>
----> 1 raise IndexError

IndexError: 
  • assert statement can trigger exceptions
assert False, 'Assert exception has been triggered.' 

>>>
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-8-4fb192a323b1> in <module>
----> 1 assert False, 'Assert excetpion has been triggered.'

AssertionError: Assert exception has been triggered.

User-Defined Exceptions

class AlreadyGotOne(Exception):
    pass 

def grail():
    raise AlreadyGotOne 
try:
    grail()
except AlreadyGotOne:
    print('got exception') 

>>>
got exception
  • By doing this, any one can define his/her own exceptions.
class Career(Exception):
    
    def __str__(self):
        return 'So I became a waiter...'
    
raise Career()    

>>>
---------------------------------------------------------------------------
Career                                    Traceback (most recent call last)
<ipython-input-13-f965ba3ecc05> in <module>
      5 
      6 
----> 7 raise Career()

Career: So I became a waiter...

Termination Actions

  • Including finally to terminate the program.
# program does not resume after processing finally block if exception is triggered.
try:
    fetcher(x, 4)
finally:
    print('after fetch.')
print('after try.') 

>>>
after fetch.
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-15-00f50b38a986> in <module>
      1 try:
----> 2     fetcher(x, 4)
      3 finally:
      4     print('after fetch.')
      5 print('after try.')

<ipython-input-1-cda73fc8bc2e> in fetcher(obj, index)
      1 def fetcher(obj, index):
----> 2     return obj[index]
      3 
      4 
      5 x = 'spam'

IndexError: string index out of range

# The program continues after finally block is processed if no exception is triggered.
try:
    fetcher(x, 3)
finally:
    print('after fetch.')
print('after try.') 

>>>
after fetch.
after try
  • You can use finally block to ensure the opened file is closed or disconnect servers.
  • A general model for error handling in Python
def do_stuff():
    do_1st_thing()
    do_2nd_thing()
    ...
    do_last_thing()

if __name__ == '__main__':
    try:
         do_stuff()
    except:
         bad_ending()
    else:
         good_ending()

Summary

  • Exception processing is useful for error handling, termination actions, and event notification.
  • Any uncaught exception eventually filters up to the default exception handler.
  • raise and assert statements can be used to trigger an exception, exactly as if it had been raised by Python itself.
  • The try/finally and with (only works with the objects that support it) can ensure some statements are executed whether the exceptions occur or not.

相关文章

网友评论

    本文标题:Chapter 33: Exception Basics

    本文链接:https://www.haomeiwen.com/subject/tqpryltx.html