# Try and Except

## Python Try Except

The `try` block lets you test a block of code for errors.

The `except` block lets you handle the error.

The `else` block lets you execute code when there is no error.

The `finally` block lets you execute code, regardless of the result of the try- and except blocks.

***

### Exception Handling

When an error occurs, or exception as we call it, Python will normally stop and generate an error message.

These exceptions can be handled using the `try` statement:

#### Example

The `try` block will generate an exception, because `x` is not defined:<br>

```python
try:
  print(x)
except:
  print("An exception occurred")
```

Since the try block raises an error, the except block will be executed.

Without the try block, the program will crash and raise an error:

#### Example

This statement will raise an error, because `x` is not defined:

`print(x)`

### Many Exceptions

You can define as many exception blocks as you want, e.g. if you want to execute a special block of code for a special kind of error:

#### Example

Print one message if the try block raises a `NameError` and another for other errors:

```python
try:
  print(x)
except NameError:
  print("Variable x is not defined")
except:
  print("Something else went wrong")
```

### Else

You can use the `else` keyword to define a block of code to be executed if no errors were raised:

#### Example

In this example, the `try` block does not generate any error:

```python
try:
  print("Hello")
except:
  print("Something went wrong")
else:
  print("Nothing went wrong")
```

### Finally

The `finally` block, if specified, will be executed regardless if the try block raises an error or not.

#### Example

```python
try:
  print(x)
except:
  print("Something went wrong")
finally:
  print("The 'try except' is finished")
```

This can be useful to close objects and clean up resources:

#### Example

Try to open and write to a file that is not writable

```python
try:
  f = open("demofile.txt")
  try:
    f.write("Lorum Ipsum")
  except:
    print("Something went wrong when writing to the file")
  finally:
    f.close()
except:
  print("Something went wrong when opening the file")
```

The program can continue, without leaving the file object open.

***

### Raise an exception

As a Python developer you can choose to throw an exception if a condition occurs.

To throw (or raise) an exception, use the `raise` keyword.

#### Example

Raise an error and stop the program if x is lower than 0:

```python
x = -1

if x < 0:
  raise Exception("Sorry, no numbers below zero")
```

The `raise` keyword is used to raise an exception.

You can define what kind of error to raise, and the text to print to the user.

#### Example

Raise a TypeError if x is not an integer:

```python
x = "hello"

if not type(x) is int:
  raise TypeError("Only integers are allowed")

```
