w3resource

Understanding Python Try-Except: Examples and Use Cases

Introduction to Python’s Try-Except Mechanism

Python's 'try-except' mechanism is a powerful way to handle errors and exceptions that might occur during the execution of a program. In addition to 'try' and 'except', Python provides 'else' and 'finally' blocks, which allow for even more fine-grained control over what happens when exceptions occur-or don't. Here we focus on practical examples with minimal theory, so you can see how these blocks work in real-world scenarios.

Example 1: Basic 'try-except' Block

In this example, the conversion of the string "100" to an integer succeeds, so the 'except' block is never executed. The 'try' block runs successfully, demonstrating a simple use case where no error occurs.

Code:

try:
    # Attempt to convert a string to an integer, which will succeed
    number = int("100")
    print(f"Converted number: {number}")
except ValueError:
    # This block will not be executed since no exception occurs
    print("This will not print.")

Output:

Converted number: 100

Example 2: Handling an Exception with 'except'

Here, the string "Python" cannot be converted to an integer, so a 'ValueError' is raised and caught by the 'except' block. This prevents the program from crashing and allows you to handle the error gracefully.

Code:

try:
    # Attempt to convert an invalid string to an integer
    number = int("Python")
except ValueError:
    # This block handles the ValueError that occurs during conversion
    print("Invalid input! Cannot convert 'Python' to an integer.")

Output:

Invalid input! Cannot convert 'Python' to an integer.

Explanation:

  • When the 'int("Python")' operation fails, a 'ValueError' is raised.
  • The 'except' block catches this specific error and handles it by printing a message.

Example 3: Using Multiple 'except' Blocks

This example demonstrates handling different exceptions separately. The 'ZeroDivisionError' is caught by the appropriate 'except' block, while the ‘ValueError’ block is skipped since no conversion error occurs.

Code:

try:
    # Attempt to divide a number by zero
    result = 100 / 0
except ZeroDivisionError:
    # Handle division by zero
    print("Cannot divide by zero!")
except ValueError:
    # Handle conversion errors (this block won't run in this case)
    print("Conversion error occurred.")

Output:

Cannot divide by zero!

Explanation:

  • You can have multiple 'except' blocks to handle different types of exceptions.
  • Python will execute the first 'except' block that matches the type of exception raised.

Example 4: 'else' Block

In this example, the division operation is successful, so the 'else' block runs, printing the result. The 'else' block allows you to execute code only when the 'try' block doesn't raise any exceptions.

Code:

try:
    # Attempt to divide two numbers
    result = 100 / 2
except ZeroDivisionError:
    # Handle division by zero
    print("Cannot divide by zero!")
else:
    # This block runs only if no exception occurs
    print(f"Division successful: {result}")

Output:

Division successful: 50.0

Explanation:

  • The 'else' block runs only if the ‘try’ block executes successfully without any exceptions.
  • It's useful for code that should run only when no errors occur.

Example 5: 'finally' Block

In this example, we attempt to open a non-existent file, raising a 'FileNotFoundError'. The 'finally' block executes regardless of the outcome, demonstrating its use for actions that should always be performed.

Code:

try:
    # Attempt to open a file that doesn't exist
    file = open("test.txt", "r")
except FileNotFoundError:
    # Handle the exception if the file is not found
    print("File not found!")
finally:
    # This block always runs, whether an exception occurred or not
    print("This will always execute.")

Output:

File not found!
This will always execute.

Explanation:

  • The 'finally' block runs no matter what, even if an exception is raised.
  • It's often used for cleanup actions, like closing files or releasing resources.

Example 6: Combining 'try-except-else-finally'

This example showcases a complete 'try-except-else-finally' structure. The user is prompted to input a number, which is then divided by 2. The code handles invalid inputs and ensures that a final message is printed regardless of what happens during execution.

Code:

try:
    # Attempt to read a number from the user and divide it by 2
    number = int(input("Input a number: "))
    result = number / 2
except ValueError:
    # Handle invalid input conversion
    print("Invalid input! Please enter a number.")
except ZeroDivisionError:
    # Handle division by zero (though it won't occur in this case)
    print("Cannot divide by zero!")
else:
    # This block runs only if no exceptions are raised
    print(f"Half of {number} is {result}")
finally:
    # This block always runs
    print("Thank you for using our division tool.")

Output:

Input a number: 34
Half of 34 is 17.0
Thank you for using our division tool.
Input a number: 45
Half of 45 is 22.5
Thank you for using our division tool.

Explanation:

  • All four blocks ('try', 'except', 'else', and 'finally') are combined here.
  • The 'try' block attempts to convert user input to an integer and divide it.
  • The 'except' blocks handle potential errors.
  • The 'else' block runs only if no exceptions occur.
  • The 'finally' block runs at the end, no matter what.

Example 7: Nested try-except Blocks

This example demonstrates how you can nest 'try-except' blocks to handle errors in different contexts. The division by zero is caught by the inner 'except', while the outer 'except' catches an index error, showing how to manage multiple potential exceptions in different parts of the code.

Code:

try:
    # Outer try block
    try:
        # Attempt to divide by zero
        result = 10 / 0
    except ZeroDivisionError:
        # Handle division by zero
        print("Division by zero in inner try block.")
    # Attempt to access an invalid index
    my_list = [1, 2, 3]
    print(my_list[5])
except IndexError:
    # Handle the invalid index access in the outer try block
    print("Index out of range in outer try block.")

Output:

Division by zero in inner try block.
Index out of range in outer try block.

Explanation:

  • 'try-except' blocks can be nested, allowing for more specific error handling in different parts of your code.
  • The inner 'try-except' handles division by zero, while the outer 'try-except' handles an index error.


Become a Patron!

Follow us on Facebook and Twitter for latest update.