Why do we need the “finally” clause in Python?

前端 未结 14 1837
感情败类
感情败类 2020-11-28 16:58

I am not sure why we need finally in try...except...finally statements. In my opinion, this code block

try:
    run_code1()
except          


        
相关标签:
14条回答
  • 2020-11-28 17:54

    It makes a difference if you return early:

    try:
        run_code1()
    except TypeError:
        run_code2()
        return None   # The finally block is run before the method returns
    finally:
        other_code()
    

    Compare to this:

    try:
        run_code1()
    except TypeError:
        run_code2()
        return None   
    
    other_code()  # This doesn't get run if there's an exception.
    

    Other situations that can cause differences:

    • If an exception is thrown inside the except block.
    • If an exception is thrown in run_code1() but it's not a TypeError.
    • Other control flow statements such as continue and break statements.
    0 讨论(0)
  • 2020-11-28 17:55

    Finally can also be used when you want to run "optional" code before running the code for your main work and that optional code may fail for various reasons.

    In the following example, we don't know precisely what kind of exceptions store_some_debug_info might throw.

    We could run:

    try:
      store_some_debug_info()
    except Exception:
      pass
    do_something_really_important() 
    

    But, most linters will complain about catching too vague of an exception. Also, since we're choosing to just pass for errors, the except block doesn't really add value.

    try:
      store_some_debug_info()
    finally:
      do_something_really_important()     
    

    The above code has the same effect as the 1st block of code but is more concise.

    0 讨论(0)
  • 2020-11-28 17:57

    I was trying to run a code where i wanted to read excel sheets. Issue was, if there is a file which has no sheet named say : SheetSum I am not able to move it to error location!! Code i wrote was:

    def read_file(data_file):
        # data_file = '\rr\ex.xlsx'
        sheets = {}
        try:
            print("Reading file: "+data_file)
            sheets['df_1'] = pd.read_excel(open(data_file,'rb'), 'SheetSum')
        except Exception as excpt:
            print("Exception occurred", exc_info=True)
        return sheets
    
    read_file(file)
    shutil.move( file, dirpath +'\\processed_files')
    

    Giving Error :

    [WinError 32] The process cannot access the file because it is being used by another process

    I had to add full try except with finally block and tell finally i need to close the file in any case like:

    def read_file(data_file):
        # data_file = '\rr\ex.xlsx'
        sheets = {}
        try:
            print("Reading file: "+data_file)
            sheets_file = open(data_file,'rb')
            sheets['df_1'] = pd.read_excel(sheets_file, 'SheetSum')
        except Exception as excpt:
            print("Exception occurred", exc_info=True)
        finally:
            sheets_file.close()
        return sheets
    
    read_file(file)
    shutil.move( file, dirpath +'\\processed_files')
    

    Otherwise, file still remains open is the background.

    If finally is present, it specifies a cleanup handler. The try clause is executed, including any except and else clauses. If an exception occurs in any of the clauses and is not handled, the exception is temporarily saved. The finally clause is executed. If there is a saved exception it is re-raised at the end of the finally clause. If the finally clause raises another exception, the saved exception is set as the context of the new exception.

    ..More Here

    0 讨论(0)
  • 2020-11-28 18:02

    You can use finally to make sure files or resources are closed or released regardless of whether an exception occurs, even if you don't catch the exception. (Or if you don't catch that specific exception.)

    myfile = open("test.txt", "w")
    
    try:
        myfile.write("the Answer is: ")
        myfile.write(42)   # raises TypeError, which will be propagated to caller
    finally:
        myfile.close()     # will be executed before TypeError is propagated
    

    In this example you'd be better off using the with statement, but this kind of structure can be used for other kinds of resources.

    A few years later, I wrote a blog post about an abuse of finally that readers may find amusing.

    0 讨论(0)
  • 2020-11-28 18:02

    finally is for defining "clean up actions". The finally clause is executed in any event before leaving the try statement, whether an exception (even if you do not handle it) has occurred or not.

    I second @Byers's example.

    0 讨论(0)
  • 2020-11-28 18:03

    A try block has just one mandatory clause: The try statement. The except, else and finally clauses are optional and based on user preference.

    finally: Before Python leaves the try statement, it will run the code in the finally block under any conditions, even if it's ending the program. E.g., if Python ran into an error while running code in the except or else block, the finally block will still be executed before stopping the program.

    0 讨论(0)
提交回复
热议问题