@@ -137,18 +137,25 @@ def text_accumulator() -> TextAccumulator:
137137return TextAccumulator (append ,output )
138138
139139
140+ @dc .dataclass
140141class ClinicError (Exception ):
141- def __init__ (
142- self ,
143- message :str ,
144- / ,
145- * ,
146- lineno :int | None = None ,
147- filename :str | None = None
148- )-> None :
149- super ().__init__ (message )
150- self .lineno = lineno
151- self .filename = filename
142+ message :str
143+ _ :dc .KW_ONLY
144+ lineno :int | None = None
145+ filename :str | None = None
146+
147+ def __post_init__ (self )-> None :
148+ super ().__init__ (self .message )
149+
150+ def report (self ,* ,warn_only :bool = False )-> str :
151+ msg = "Warning" if warn_only else "Error"
152+ if self .filename is not None :
153+ msg += f" in file{ self .filename !r} "
154+ if self .lineno is not None :
155+ msg += f" on line{ self .lineno } "
156+ msg += ":\n "
157+ msg += f"{ self .message } \n "
158+ return msg
152159
153160
154161@overload
@@ -179,16 +186,11 @@ def warn_or_fail(
179186filename = clinic .filename
180187if getattr (clinic ,'block_parser' ,None )and (line_number is None ):
181188line_number = clinic .block_parser .line_number
189+ error = ClinicError (joined ,filename = filename ,lineno = line_number )
182190if fail :
183- raise ClinicError ( joined , lineno = line_number , filename = filename )
191+ raise error
184192else :
185- msg = "Warning"
186- if filename is not None :
187- msg += f" in file{ filename !r} "
188- if line_number is not None :
189- msg += f" on line{ line_number } "
190- msg += f":{ joined } "
191- print (msg )
193+ print (error .report (warn_only = True ))
192194
193195
194196def warn (
@@ -5734,13 +5736,7 @@ def main(argv: list[str] | None = None) -> NoReturn:
57345736try :
57355737run_clinic (parser ,args )
57365738except ClinicError as exc :
5737- sys .stderr .write ("Error" )
5738- if exc .filename is not None :
5739- sys .stderr .write (f" in file{ exc .filename !r} " )
5740- if exc .lineno is not None :
5741- sys .stderr .write (f" on line{ exc .lineno } " )
5742- sys .stderr .write (":\n " )
5743- sys .stderr .write (f"{ exc } \n " )
5739+ sys .stderr .write (exc .report ())
57445740sys .exit (1 )
57455741else :
57465742sys .exit (0 )