Personally, I would simplify this greatly.
The annotations in this case are not doing much for you.
With int()
you really only have two possible errors from in-memory data:
ValueError
- from trying to convert something that cannot be converted such as int('')
TypeError
- from trying to convert something other than a string or numeric type (like int(1.23)
) such as int({'1':'2'})
or int(['1','2'])
would be TypeErrors.
These are the only two exceptions you should handle in your function given its defined scope. If you try and broadly handle more than you are prepared to handle you risk masking many other exceptions that are better handled by Python, the OS, or the part of your program that called this function.
It is also more common in Python to return the item if successful and None
if not. Be sure to explicitly test is None
vs just testing truth of false of the return. A return of None
or 0
or []
are all False
but only None
is
None. (Although the way you are going is seen in Python, it is not super common IMHO.)
Simplified:
import sys
def get_int_list(list_data):
try:
return [int(element) for element in list_data]
# limit 'except' to:
# 1) What is a likely exception in THIS function directly from 'try' and
# 2) what you are prepared to handle
# Other exceptions should be handled by caller, Python or OS
except (ValueError, TypeError) as e:
print("Failed to convert int elements list")
print(e)
# options now are:
# 1) return None
# 2) return []
# 3) exit program here
# 4) set a flag by returning a consistent data structure or object
# which you choose is based on how the function is called
return None
# you would handle Exceptions building the list HERE - not in the function
my_list = ["1", "2", "3"]
nums=get_int_list(my_list)
if nums is None:
# failure -- exit
sys.exit(1)
#success
print(nums)
sys.exit(0)
There are other ways of course, such using a decorator or a User Defined Exception but these are used when you have many more possible errors to deal with.