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

前端 未结 14 1835
感情败类
感情败类 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:38

    The code blocks are not equivalent. The finally clause will also be run if run_code1() throws an exception other than TypeError, or if run_code2() throws an exception, while other_code() in the first version wouldn't be run in these cases.

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

    Run these Python3 codes to watch the need of finally:

    CASE1:

    count = 0
    while True:
        count += 1
        if count > 3:
            break
        else:
            try:
                x = int(input("Enter your lock number here: "))
    
                if x == 586:
                    print("Your lock has unlocked :)")
    
                    break
                else:
                    print("Try again!!")
    
                    continue
    
            except:
                print("Invalid entry!!")
            finally:
                print("Your Attempts: {}".format(count))
    

    CASE2:

    count = 0
    
    while True:
        count += 1
        if count > 3:
            break
        else:
            try:
                x = int(input("Enter your lock number here: "))
    
                if x == 586:
                    print("Your lock has unlocked :)")
    
                    break
                else:
                    print("Try again!!")
    
                    continue
    
            except:
                print("Invalid entry!!")
    
            print("Your Attempts: {}".format(count))
    

    Try the following inputs each time:

    1. random integers
    2. correct code which is 586(Try this and you will get your answer)
    3. random strings

    ** At a very early stage of learning Python.

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

    In your first example, what happens if run_code1() raises an exception that is not TypeError? ... other_code() will not be executed.

    Compare that with the finally: version: other_code() is guaranteed to be executed regardless of any exception being raised.

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

    Using delphi professionally for some years taught me to safeguard my cleanup routines using finally. Delphi pretty much enforces the use of finally to clean up any resources created before the try block, lest you cause a memory leak. This is also how Java, Python and Ruby works.

    resource = create_resource
    try:
      use resource
    finally:
      resource.cleanup
    

    and resource will be cleaned up regardless of what you do between try and finally. Also, it won't be cleaned up if execution never reaches the try block. (i.e. create_resource itself throws an exception) It makes your code "exception safe".

    As to why you actually need a finally block, not all languages do. In C++ where you have automatically called destructors which enforce cleanup when an exception unrolls the stack. I think this is a step up in the direction of cleaner code compared to try...finally languages.

    {    
      type object1;
      smart_pointer<type> object1(new type());
    } // destructors are automagically called here in LIFO order so no finally required.
    
    0 讨论(0)
  • 2020-11-28 17:48

    To add to the other answers above, the finally clause executes no matter what whereas the else clause executes only if an exception was not raised.

    For example, writing to a file with no exceptions will output the following:

    file = open('test.txt', 'w')
    
    try:
        file.write("Testing.")
        print("Writing to file.")
    except IOError:
        print("Could not write to file.")
    else:
        print("Write successful.")
    finally:
        file.close()
        print("File closed.")
    

    OUTPUT:

    Writing to file.
    Write successful.
    File closed.
    

    If there is an exception, the code will output the following, (note that a deliberate error is caused by keeping the file read-only.

    file = open('test.txt', 'r')
    
    try:
        file.write("Testing.")
        print("Writing to file.")
    except IOError:
        print("Could not write to file.")
    else:
        print("Write successful.")
    finally:
        file.close()
        print("File closed.")
    

    OUTPUT:

    Could not write to file.
    File closed.
    

    We can see that the finally clause executes regardless of an exception. Hope this helps.

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

    They are not equivalent. Finally code is run no matter what else happens. It is useful for cleanup code that has to run.

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