Difficult-Rocket/Difficult_Rocket/crash.py
2021-09-05 00:50:05 +08:00

87 lines
2.4 KiB
Python

"""
writen by shenjackyuanjie
mail: 3695888@qq.com
github: @shenjackyuanjie
gitee: @shenjackyuanjie
"""
import os
import threading
import time
import traceback
from typing import Optional
# where the crash report from
# this can't be crash , or the game will really crash!
# TODO 写完它
Head_message = """# ----- Difficult Rocket Crash Report -----
## Traceback
"""
Thread_message = """## Thread info
"""
System_message = """## System info
"""
def thread_crash_check() -> None:
"""
Need to run in a new thread
will raise error when any thread raise error
maybe will create a crash report
"""
all_thread = {}
thread_local = threading.local()
for thread in threading.enumerate():
if thread not in all_thread:
all_thread[thread.name] = thread
for any_thread in all_thread:
if not all_thread[any_thread].is_alive():
pass
# if all_thread[any_thread].exitcode
def crash_info_handler(info: str = None) -> str:
if not info:
info = traceback.format_exc()
format_info = '- {}'.format(info.replace('\n', '\n- '))
if (format_info.rfind('- ') + 2) == len(format_info):
format_info = format_info[:-2]
return format_info
def markdown_line_handler(string: Optional[str or bool or int or float], code: bool = False, level: int = 1) -> str:
lvl = '- ' * level
f_string = string
if code:
f_string = '`{}`'.format(f_string)
return '{}{}\n'.format(lvl, f_string)
def create_crash_report(info: str = None) -> None:
crash_info = crash_info_handler(info)
if 'crash_report' not in os.listdir('./'):
os.mkdir('./crash_report')
date_time = time.strftime('%Y-%m-%d %H-%M-%S', time.gmtime(time.time()))
filename = 'crash-{}.md'.format(date_time)
with open('./crash_report/{}'.format(filename), 'w+') as crash_file:
crash_file.write(Head_message) # 开头信息
crash_file.write(crash_info)
crash_file.write(Thread_message)
for thread in threading.enumerate():
crash_file.write(markdown_line_handler(thread.name, code=True))
crash_file.write(markdown_line_handler(f'Ident: {thread.ident}', level=2))
crash_file.write(markdown_line_handler(f'Daemon: {thread.isDaemon()}', level=2))
crash_file.write(System_message)
if __name__ == '__main__':
os.chdir('../')
try:
raise FileNotFoundError('abc')
except:
create_crash_report()