@@ -136,7 +136,9 @@ async def on_start(self, ctx: RequestContext) -> T:
136136 """
137137 ...
138138
139- async def on_end (self , token : T , ctx : RequestContext ) -> None :
139+ async def on_end (
140+ self , token : T , ctx : RequestContext , error : Exception | None
141+ ) -> None :
140142 """Called when the RPC ends."""
141143 return
142144
@@ -164,10 +166,14 @@ async def intercept_unary(
164166 ctx : RequestContext ,
165167 ) -> RES :
166168 token = await self ._delegate .on_start (ctx )
169+ error : Exception | None = None
167170 try :
168171 return await call_next (request , ctx )
172+ except Exception as e :
173+ error = e
174+ raise
169175 finally :
170- await self ._delegate .on_end (token , ctx )
176+ await self ._delegate .on_end (token , ctx , error )
171177
172178 async def intercept_client_stream (
173179 self ,
@@ -176,10 +182,14 @@ async def intercept_client_stream(
176182 ctx : RequestContext ,
177183 ) -> RES :
178184 token = await self ._delegate .on_start (ctx )
185+ error : Exception | None = None
179186 try :
180187 return await call_next (request , ctx )
188+ except Exception as e :
189+ error = e
190+ raise
181191 finally :
182- await self ._delegate .on_end (token , ctx )
192+ await self ._delegate .on_end (token , ctx , error )
183193
184194 async def intercept_server_stream (
185195 self ,
@@ -188,11 +198,15 @@ async def intercept_server_stream(
188198 ctx : RequestContext ,
189199 ) -> AsyncIterator [RES ]:
190200 token = await self ._delegate .on_start (ctx )
201+ error : Exception | None = None
191202 try :
192203 async for response in call_next (request , ctx ):
193204 yield response
205+ except Exception as e :
206+ error = e
207+ raise
194208 finally :
195- await self ._delegate .on_end (token , ctx )
209+ await self ._delegate .on_end (token , ctx , error )
196210
197211 async def intercept_bidi_stream (
198212 self ,
@@ -201,11 +215,15 @@ async def intercept_bidi_stream(
201215 ctx : RequestContext ,
202216 ) -> AsyncIterator [RES ]:
203217 token = await self ._delegate .on_start (ctx )
218+ error : Exception | None = None
204219 try :
205220 async for response in call_next (request , ctx ):
206221 yield response
222+ except Exception as e :
223+ error = e
224+ raise
207225 finally :
208- await self ._delegate .on_end (token , ctx )
226+ await self ._delegate .on_end (token , ctx , error )
209227
210228
211229def resolve_interceptors (
0 commit comments