Coverage for fastapi/exceptions.py: 100%

34 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2025-09-09 09:16 +0000

1from typing import Any, Dict, Optional, Sequence, Type, Union 1abcdef

2 

3from pydantic import BaseModel, create_model 1abcdef

4from starlette.exceptions import HTTPException as StarletteHTTPException 1abcdef

5from starlette.exceptions import WebSocketException as StarletteWebSocketException 1abcdef

6from typing_extensions import Annotated, Doc 1abcdef

7 

8 

9class HTTPException(StarletteHTTPException): 1abcdef

10 """ 

11 An HTTP exception you can raise in your own code to show errors to the client. 

12 

13 This is for client errors, invalid authentication, invalid data, etc. Not for server 

14 errors in your code. 

15 

16 Read more about it in the 

17 [FastAPI docs for Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/). 

18 

19 ## Example 

20 

21 ```python 

22 from fastapi import FastAPI, HTTPException 

23 

24 app = FastAPI() 

25 

26 items = {"foo": "The Foo Wrestlers"} 

27 

28 

29 @app.get("/items/{item_id}") 

30 async def read_item(item_id: str): 

31 if item_id not in items: 

32 raise HTTPException(status_code=404, detail="Item not found") 

33 return {"item": items[item_id]} 

34 ``` 

35 """ 

36 

37 def __init__( 1abcdef

38 self, 

39 status_code: Annotated[ 

40 int, 

41 Doc( 

42 """ 

43 HTTP status code to send to the client. 

44 """ 

45 ), 

46 ], 

47 detail: Annotated[ 

48 Any, 

49 Doc( 

50 """ 

51 Any data to be sent to the client in the `detail` key of the JSON 

52 response. 

53 """ 

54 ), 

55 ] = None, 

56 headers: Annotated[ 

57 Optional[Dict[str, str]], 

58 Doc( 

59 """ 

60 Any headers to send to the client in the response. 

61 """ 

62 ), 

63 ] = None, 

64 ) -> None: 

65 super().__init__(status_code=status_code, detail=detail, headers=headers) 2ompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0mQ 1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnR YnZn0n1n2n3n4n5n6n7n8n9n!n#n$n%n'n(n)n*n+n,n-n.n/n:n;n=n?n@n[n]n^n_n`n{n|n}n~naobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoS VoWoXoYoZo0o1o2o3o4o5o6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpT SpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p_p`p{p|p}p~paqbqcqdqeqfqgqhqiqjqkqlqmqnqoqpqqqrqsqtquqvqwqxqyqzqAqBqCqDqEqFqGqHqIqJqKqLqMqNqOqU PqQqRqSqTqUqVqWqXqYqZq0q1q2q3q4q5q6q7q8q9q!q#q$q%q'q(q)q*q+q,q-q.q/q:q;q=q?q@q[q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCrDrErFrGrHrIrJrKrLrV MrNrOrPrQrRrSrTrUrVrWrXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r

66 

67 

68class WebSocketException(StarletteWebSocketException): 1abcdef

69 """ 

70 A WebSocket exception you can raise in your own code to show errors to the client. 

71 

72 This is for client errors, invalid authentication, invalid data, etc. Not for server 

73 errors in your code. 

74 

75 Read more about it in the 

76 [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/). 

77 

78 ## Example 

79 

80 ```python 

81 from typing import Annotated 

82 

83 from fastapi import ( 

84 Cookie, 

85 FastAPI, 

86 WebSocket, 

87 WebSocketException, 

88 status, 

89 ) 

90 

91 app = FastAPI() 

92 

93 @app.websocket("/items/{item_id}/ws") 

94 async def websocket_endpoint( 

95 *, 

96 websocket: WebSocket, 

97 session: Annotated[str | None, Cookie()] = None, 

98 item_id: str, 

99 ): 

100 if session is None: 

101 raise WebSocketException(code=status.WS_1008_POLICY_VIOLATION) 

102 await websocket.accept() 

103 while True: 

104 data = await websocket.receive_text() 

105 await websocket.send_text(f"Session cookie is: {session}") 

106 await websocket.send_text(f"Message text was: {data}, for item ID: {item_id}") 

107 ``` 

108 """ 

109 

110 def __init__( 1abcdef

111 self, 

112 code: Annotated[ 

113 int, 

114 Doc( 

115 """ 

116 A closing code from the 

117 [valid codes defined in the specification](https://datatracker.ietf.org/doc/html/rfc6455#section-7.4.1). 

118 """ 

119 ), 

120 ], 

121 reason: Annotated[ 

122 Union[str, None], 

123 Doc( 

124 """ 

125 The reason to close the WebSocket connection. 

126 

127 It is UTF-8-encoded data. The interpretation of the reason is up to the 

128 application, it is not specified by the WebSocket specification. 

129 

130 It could contain text that could be human-readable or interpretable 

131 by the client code, etc. 

132 """ 

133 ), 

134 ] = None, 

135 ) -> None: 

136 super().__init__(code=code, reason=reason) 2{r|r}r~rasbs

137 

138 

139RequestErrorModel: Type[BaseModel] = create_model("Request") 1abcdef

140WebSocketErrorModel: Type[BaseModel] = create_model("WebSocket") 1abcdef

141 

142 

143class FastAPIError(RuntimeError): 1abcdef

144 """ 

145 A generic, FastAPI-specific error. 

146 """ 

147 

148 

149class ValidationException(Exception): 1abcdef

150 def __init__(self, errors: Sequence[Any]) -> None: 1abcdef

151 self._errors = errors 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' Ll( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbg h i j k l KbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,bQ -b.b/b:bMl;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBccmCcDcNlOlPlQlRlSlTldmEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcUlXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdm n o p q r sdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1dR 2d3d4d5dVl6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejeemkeleWlXlYlZl0l1l2lfmmeneoepeqereseteuevewexeyezeAeBeCeDeEe3lFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfs t u v w x cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfS MfNfOfPf4lQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^fgm_f`f5l6l7l8l9l!l#lhm{f|f}f~fagbgcgdgegfggghgigjgkglgmgngog$lpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/gy z A B C D :g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhT whxhyhzh%lAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'him(h)h'l(l)l*l+l,l-ljm*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h.l~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6iE F G H I J 7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjU gjhjijjj/lkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjkmZj0j:l;l=l?l@l[l]llm1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j^l-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkK L M N O P RkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?kV @k[k]k^k_l_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlmmJlKl`l{l|l}l~lambmnm

152 

153 def errors(self) -> Sequence[Any]: 1abcdef

154 return self._errors 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,bQ -b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBccmCcDcdmEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1dR 2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejeemkelefmmeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfS MfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^fgm_f`fhm{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhT whxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'him(h)hjm*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjU gjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjkmZj0jlm1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?kV @k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlmmJlKlnm

155 

156 

157class RequestValidationError(ValidationException): 1abcdef

158 def __init__(self, errors: Sequence[Any], *, body: Any = None) -> None: 1abcdef

159 super().__init__(errors) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' Ll* + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,bQ -b.b/b:bMl;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcUlZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1dR 2d3d4d5dVl6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEe3lHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfS MfNfOfPf4lQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngog$lrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhT whxhyhzh%lAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h.lbicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjU gjhjijjj/lkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j^l/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?kV @k[k]k^k_l_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKl

160 self.body = body 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' Ll* + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,bQ -b.b/b:bMl;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcUlZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1dR 2d3d4d5dVl6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEe3lHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfS MfNfOfPf4lQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngog$lrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhT whxhyhzh%lAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h.lbicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjU gjhjijjj/lkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j^l/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?kV @k[k]k^k_l_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKl

161 

162 

163class WebSocketRequestValidationError(ValidationException): 1abcdef

164 pass 1abcdef

165 

166 

167class ResponseValidationError(ValidationException): 1abcdef

168 def __init__(self, errors: Sequence[Any], *, body: Any = None) -> None: 1abcdef

169 super().__init__(errors) 2( ) g h i j k l NlOlPlQlRlSlTlXcYcm n o p q r WlXlYlZl0l1l2lFeGes t u v w x 5l6l7l8l9l!l#lpgqgy z A B C D 'l(l)l*l+l,l-l~haiE F G H I J :l;l=l?l@l[l]l-j.jK L M N O P `l{l|l}l~lambm

170 self.body = body 2( ) g h i j k l NlOlPlQlRlSlTlXcYcm n o p q r WlXlYlZl0l1l2lFeGes t u v w x 5l6l7l8l9l!l#lpgqgy z A B C D 'l(l)l*l+l,l-l~haiE F G H I J :l;l=l?l@l[l]l-j.jK L M N O P `l{l|l}l~lambm

171 

172 def __str__(self) -> str: 1abcdef

173 message = f"{len(self._errors)} validation errors:\n" 1ghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP

174 for err in self._errors: 1ghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP

175 message += f" {err}\n" 1ghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP

176 return message 1ghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP