# Exception Handling

## Exception handling:

* We don't want to scare the user away
* We don't want the user to see log like stack traces when errors are shown
* That's where exception handling comes in

#### Raw code before exception handling:

```python
def sum(num1, num2):
	print(num1+num2)
	
number1 = input("Enter a number: ")

sum(number1, 12)
```

* Will generate a type error as the `input` function converts anything you give it to string
* Any code other than 0 generates an error
* Error:

```python
Traceback (most recent call last):
  File "c:\Users\$USERNAME\Desktop\test.py", line 6, in <module>
    sum(number1, 12)
  File "c:\Users\$USERNAME\Desktop\test.py", line 2, in sum     
    print(num1+num2)
TypeError: can only concatenate str (not "int") to str
```

* By handling exceptions, you don't display the above stack to the user

#### Code after exception handling:

* To handle the errors there is a special syntax called `try` and `except`

```python
def sum(num1, num2):
	try:
		print(num1+num2)
	except:
		print("There was an error")
		
print('HELLO')
	
number1 = input("Enter a number: ")

sum(number1, 12)
```

* By handling the Exception, the rest of the code in the grand scope will run
  * Such as `print('HELLO')`
  * This is due to scope
* The exception will be handled gracefully and will not crash the rest of the program

#### **Exception handling should be used only if you don't have any control over how it is used**

* Example:
  * The software goes to the internet and downloads files, and the user runs your program with no internet access, that could cause a crash
  * Another example is if the program relies on a file to be on the file system. If that is not there it will crash

#### The above code does not need any exception handling really, as the data type is in our control

```python
def sum(num1, num2):
	if isinstance(num1, int) and isinstance(num2, int):
		print(num1+num2)
	else:
		print('Please enter numbers only')
		
number1 = input("Enter a number: ")
sum(number1, 12)
```

* `isinstance` checks for data types specified


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.arkannis.net/programming/courses/python-pcap-31-03-course/file-io-and-exception-handling/exception-handling.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
