SaidBySolo 8b58f951b6404b78ae3ba92d55d431f7
프로젝트 진행중에 버그 발생시에 추적을 어케할까 생각하고있었는데
uuid와 함께 traceback을 넣고 올리면 찾기 쉽지 않을까 싶어서 코딩을 하던중에
discord.py에 on_command_error
라는 이벤트가있더라고요
무턱대고 가져가서 코딩을 시작했죠
근데 주는게.... error뿐인거에요!
아니 미친 예외로 어케 traceback을 가져오나 생각했는데
있네....?
일단 예외에 __traceback__
이라는 매직 메서드가 있더라고요
일단 그래서 ''.join(traceback.format_exception(type(error), error, error.__traceback__)
이렇게 지르고봤죠
리턴값이 보니까 리스트로 나오더라고요
잘되긴 잘되요! 근데!
Traceback (most recent call last): File "C:\Users\saidb\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\ext\commands\core.py", line 83, in wrapped ret = await coro(*args, **kwargs) File "C:\Users\saidb\Documents\GitHub\sbsschoolbot\schoolbot\cogs\school\academic_schedule.py", line 15, in _academic_schedule await ctx.send(a) NameError: name 'a' is not defined The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\saidb\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\ext\commands\bot.py", line 892, in invoke await ctx.command.invoke(ctx) File "C:\Users\saidb\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\ext\commands\core.py", line 797, in invoke await injected(*ctx.args, **ctx.kwargs) File "C:\Users\saidb\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\ext\commands\core.py", line 92, in wrapped raise CommandInvokeError(exc) from exc discord.ext.commands.errors.CommandInvokeError: Command raised an exception: NameError: name 'a' is not defined
이런식으로 주저리주저리 나오는거에요 제가 원하는 거긴해요,
하지만 근데 문제가 뭐냐
- 역추적에 도움이되지않는 문단이있음
- 너무김
그래서 일단 도움이 되지않는 문단을 빼기로했어요
맨상단에 traceback만 있어도 충분히 정보가 충분하거든요
다시 파이썬 레퍼런스를 읽으러 갔죠
보니까 chain...? 이란게 있어서 Hoxy나 하고 False를 하고 출력을 해봤으나..
Traceback (most recent call last): File "C:\Users\saidb\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\ext\commands\bot.py", line 892, in invoke await ctx.command.invoke(ctx) File "C:\Users\saidb\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\ext\commands\core.py", line 797, in invoke await injected(*ctx.args, **ctx.kwargs) File "C:\Users\saidb\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\ext\commands\core.py", line 92, in wrapped raise CommandInvokeError(exc) from exc discord.ext.commands.errors.CommandInvokeError: Command raised an exception: NameError: name 'a' is not defined
아니 뭔 밑에있는 traceback이 나오는거에요?
이때 부터 사람이 미쳐가기 시작했던거죠
구글신 과 스택오버플로우는 절 버리지 않겠죠 라며 검색을 돌리는데
스택오버플로우에 들갔는데 한 댓글이 눈에 띄었습니다.
__cause__
이거다 이거면 킹능성이 보인다.
''.join(traceback.format_exception(type(error.__cause__), error.__cause__, error.__cause__.__traceback__
바로 붙여주고 돌려보았더니!
Traceback (most recent call last): File "C:\Users\saidb\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\ext\commands\core.py", line 83, in wrapped ret = await coro(*args, **kwargs) File "C:\Users\saidb\Documents\GitHub\sbsschoolbot\schoolbot\cogs\school\academic_schedule.py", line 15, in _academic_schedule await ctx.send(a) NameError: name 'a' is not defined
!!!!!!!!!!!!!!!!!
의도한대로 나오게됬네요
이걸 전부 제가 아는대로 정리하자면
__cause__는 예외의 원인입니다. 찾아보니 직접 링크한다 하더라고요
__traceback__ 는스택을 보여줍니다.
따라서 __cause__ 메서드를 활용하면서 맨처음 발생된 예외를 가져올수있었습니다.
아 만약 chain 이 없다면 __cause__가 None을 반환 하더라고요
그래서 if not error.__cause__로 저는 체인이 있는것과 없는것을 따로 분리시켜놨습니다.
혹시 자세히 알고계신분은 설명 부탁드릴게요
저도 몰라서 적어두는거라
댓글이 없습니다.
새로운 댓글을 등록해 주세요!