Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita264828

Browse files
committed
Show friendly info for syntax errors
1 parent683d4c4 commita264828

File tree

3 files changed

+45
-31
lines changed

3 files changed

+45
-31
lines changed

‎backend/main/utils/__init__.py‎

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -109,24 +109,6 @@ def format_exception_string():
109109
return''.join(traceback.format_exception_only(*sys.exc_info()[:2]))
110110

111111

112-
classFormatter(stack_data.Formatter):
113-
defformat_frame(self,frame):
114-
ifframe.filename.startswith(internal_dir):
115-
return
116-
yieldfromsuper().format_frame(frame)
117-
118-
119-
formatter=Formatter(
120-
options=stack_data.Options(before=0,after=0),
121-
pygmented=True,
122-
show_executing_node=True,
123-
)
124-
125-
126-
defprint_exception():
127-
formatter.print_exception()
128-
129-
130112
defrow_to_dict(row):
131113
d=row.__dict__.copy()
132114
deld["_sa_instance_state"]

‎backend/main/workers/tracebacks.py‎

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
importjson
22
importlogging
3+
importsys
34
importtraceback
45
fromcollectionsimportCounter
56
fromtypingimportUnion,Iterable,List
67

78
importpygments
89
fromcheap_reprimportcheap_repr
9-
fromfriendly_traceback.coreimportget_generic_explanation
10+
fromfriendly_traceback.coreimportget_generic_explanation,get_message
1011
fromfriendly_traceback.info_specificimportget_likely_cause
12+
fromfriendly_traceback.syntax_errorsimportanalyze_syntax
1113
frommarkdownimportmarkdown
1214
frompygments.formatters.htmlimportHtmlFormatter
1315
fromstack_dataimport (
@@ -40,25 +42,51 @@ def didyoumean_suggestions(e) -> List[str]:
4042
return []
4143

4244

43-
deffriendly_traceback_info(e):
44-
etype=type(e)
45+
deffriendly_generic(e):
4546
try:
46-
generic=get_generic_explanation(etype.__name__,etype,e)
47+
returnget_generic_explanation(type(e).__name__,type(e),e)
4748
exceptException:
4849
log.exception("Failed to get generic friendly explanation")
4950
return""
5051

52+
53+
deffriendly_runtime_cause(e):
5154
info= {}
5255
frame=e.__traceback__.tb_frame
5356
try:
54-
get_likely_cause(etype,e,info,frame)
57+
get_likely_cause(type(e),e,info,frame)
58+
exceptException:
59+
log.exception("Failed to get likely cause of exception")
60+
return""
61+
else:
62+
returninfo.get("cause","")
63+
64+
65+
deffriendly_syntax_cause(e):
66+
info= {"message":get_message(type(e).__name__,e)}
67+
try:
68+
analyze_syntax.set_cause_syntax(type(e),e,info)
5569
exceptException:
5670
log.exception("Failed to get likely cause of exception")
57-
cause=""
71+
return""
5872
else:
59-
cause=info.get("cause","")
73+
returninfo.get("cause","")
6074

61-
returnmarkdown(generic+"\n\n"+cause)
75+
76+
defprint_friendly_syntax_error(e):
77+
lines=iter(traceback.format_exception(*sys.exc_info()))
78+
forlineinlines:
79+
ifline.strip().startswith('File "my_program.py"'):
80+
break
81+
print(
82+
f"""\
83+
{''.join(lines).rstrip()}
84+
at line{e.lineno}
85+
86+
{friendly_generic(e)}
87+
{friendly_syntax_cause(e)}""",
88+
file=sys.stderr,
89+
)
6290

6391

6492
classTracebackSerializer:
@@ -81,7 +109,9 @@ def format_exception(self, e) -> List[dict]:
81109
),
82110
tail="",
83111
didyoumean=didyoumean_suggestions(e),
84-
friendly=friendly_traceback_info(e),
112+
friendly=markdown(
113+
friendly_generic(e)+"\n\n"+friendly_runtime_cause(e)
114+
),
85115
)
86116
)
87117
returnresult

‎backend/main/workers/worker.py‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
fromthreadingimportThread
77
fromtimeimportsleep
88

9+
importfriendly_traceback.source_cache
910
importstack_data
1011

1112
frommain.exercisesimportassert_equal
1213
frommain.textimportpages
13-
frommain.utilsimportprint_exception
1414
frommain.workers.limitsimportset_limits
15-
frommain.workers.tracebacksimportTracebackSerializer
15+
frommain.workers.tracebacksimportTracebackSerializer,print_friendly_syntax_error
1616
frommain.workers.utilsimportinternal_error_result,make_result,output_buffer
1717

1818
log=logging.getLogger(__name__)
@@ -51,10 +51,12 @@ def runner(code_source, code):
5151

5252
stack_data.Source._class_local('__source_cache', {}).pop(filename,None)
5353

54+
friendly_traceback.source_cache.cache.replace({filename:code})
55+
5456
try:
5557
code_obj=compile(code,filename,mode)
56-
exceptSyntaxError:
57-
print_exception()
58+
exceptSyntaxErrorase:
59+
print_friendly_syntax_error(e)
5860
return {}
5961

6062
birdseye_objects=None

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp