I'm trying to implement some decent exception handling in a project. I have set up the following dummy example of what my code looks like:
def task1(): pass def task2(): """Generic docstring""" a = 4 b = c def task3(): pass def task4(): pass def main(): try: task1() task2() task3() task4() except Exception as ex: print(ex) finally: print("All done") main() The above code almost does what I want. It prints the error that happened (I will log it in a file in the real code), but unfortunately it does not tell me in which subfunction the exception is triggered, and I don't see any options for getting this information. I guess I could have a separate try/except block in each subfunction that raises a message from that function, but I would prefer if I didn't have to do this and could get the information automatically.
Since my experience with error handling is rather limited, I am also very eager to hear if anyone has alternative / better solutions to how I should implement the error handling.
My use case is that I need to run this piece of code in parallel and it is very error prone since it is being run on a bunch of external files and sometimes these files just contains errors and other times the format they are in isn't quite what my code expects. I need to run millions of files and I don't want a single error to stop anything, I just want it logged in a file, such that I can later look at the errors and determine whether these are fixable errors or not.
Edit, based on the link provided by @timgeb I created the following, which does the job but isn't all that pretty.
import sys, traceback def task1(): pass def task2(): """Generic docstring""" a = 4 b = c def task3(): pass def task4(): pass def main(): try: task1() task2() task3() task4() except Exception as ex: tb = sys.exc_info()[-1] stk = traceback.extract_tb(tb, -1) fname = stk[0][2] print(f'The failing function was {fname} with error message {ex}') finally: print("All done") main()