Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
HRMOSにおけるAngularのエラーハンドリングについて
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
deepblue-will
June 13, 2019
Technology
0
470
HRMOSにおけるAngularのエラーハンドリングについて
Angularアプリの簡単・強力なエラーハンドリングの仕組みを紹介します
deepblue-will
June 13, 2019
Tweet
Share
More Decks by deepblue-will
See All by deepblue-will
5分ぐらいでざっくり紹介するCSS4
deepbluewill
0
37
振り返りのススメ
deepbluewill
0
52
Other Decks in Technology
See All in Technology
Amazon Bedrock Knowledge Basesチャンキング解説!
aoinoguchi
0
190
登壇駆動学習のすすめ — CfPのネタの見つけ方と書くときに意識していること
bicstone
3
150
10Xにおける品質保証活動の全体像と改善 #no_more_wait_for_test
nihonbuson
PRO
2
380
Why Organizations Fail: ノーベル経済学賞「国家はなぜ衰退するのか」から考えるアジャイル組織論
kawaguti
PRO
1
260
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
5.7k
Cosmos World Foundation Model Platform for Physical AI
takmin
0
1k
生成AIを活用した音声文字起こしシステムの2つの構築パターンについて
miu_crescent
PRO
3
240
Agent Skils
dip_tech
PRO
0
160
生成AIと余白 〜開発スピードが向上した今、何に向き合う?〜
kakehashi
PRO
0
220
Ruby版 JSXのRuxが気になる
sansantech
PRO
0
190
OWASP Top 10:2025 リリースと 少しの日本語化にまつわる裏話
okdt
PRO
3
950
AIエージェントを開発しよう!-AgentCore活用の勘所-
yukiogawa
0
210
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
The Cost Of JavaScript in 2023
addyosmani
55
9.5k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
360
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.3k
Become a Pro
speakerdeck
PRO
31
5.8k
Navigating Team Friction
lara
192
16k
Rails Girls Zürich Keynote
gr2m
96
14k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
130
How to Talk to Developers About Accessibility
jct
2
140
sira's awesome portfolio website redesign presentation
elsirapls
0
160
Faster Mobile Websites
deanohume
310
31k
Transcript
HRMOSにおける Angularの エラーハンドリング について Classi Angular Night#3 株式会社ビズリーチHRMOS事業部 プ ロダクト開発 杉原碧志
自己紹介 杉原碧志(@deepblue_will) HRMOSフロントエンドエンジニア 外部のイベントLTするのは2年ぶり
今日お話すること HRMOSで取り入れている いい感じにエラーハンドリングされる 仕組みを紹介します。
今日のポイント - Custom Error Class - Interceptor - ErrorHandler
Custom Error Class
Custom Error Class Errorをextendしたクラス - JSのErrorを区別できる - Errorに持たせる情報を増やすことができる
export class ApplicationError extends Error { constructor(message: string) { super(message);
// instanceofを使えるようにする Object.setPrototypeOf(this, ApplicationError.prototype); } }
// Usage const sampleFn = (type: 'A' | 'B') =>
{ switch (type) { case 'A': // anything break; case 'B': // anything break; default: throw new ApplicationError('Unsupported Type'); } };
export class RequestError extends Error { constructor(private errorResponse: HttpErrorResponse, message:
string) { super(message); // instanceofを使えるようにする Object.setPrototypeOf(this, RequestError.prototype); } get statusCode(): number { return this.errorResponse.status; } }
// Usage this.httpClient.get('/test') .pipe( catchError( (e: HttpErrorResponse) => throwError(new RequestError(e,
getMessage(e)) )
Interceptor
Interceptor HttpClientに処理を挟める API HttpClient Interceptor
Interceptor HTTPリクエストに失敗したときにRequestErrorをThrow する - 後述のErrorHandlerでエラーをハンドリングできる - 個別のエラーハンドリングもできる - ここだけ404が起きたらエラーをださずにリダイ レクトさせたい。
- ここだけエラーメッセージの出し方を変えたい。
export class HandleErrorInterceptor implements HttpInterceptor { intercept(req: HttpRequest<any>, next: HttpHandler):
Observable<HttpEvent<any>> { return next .handle(req) .pipe( catchError( (e: HttpErrorResponse) => throwError(new RequestError(e, getErrorMessage(e)))) ); } }
export function provideHttpInterceptors() { return [{ provide: HTTP_INTERCEPTORS, useClass: HandleErrorInterceptor,
multi: true }]; } @NgModule({ providers: [ provideHttpInterceptors(), ], }) export class MyModule {}
Error Handler
ErrorHandler Angularが用意しているErrorハンドリングのた めの機構。 catchされなかったすべてのエラーが到達する。
@Injectable({ providedIn: 'root' }) export class MyErrorHandler implements ErrorHandler {
handleError(e: any) { if (e instanceof RequestError) { // エラー用のトーストを表示 this.showErrorToast(e.message); } else if (e instanceof ApplicationError) { // Sentryにエラー内容を送信 Sentry.captureException(e); } else { this.showErrorToast('想定外のエラーが発生しました。'); Sentry.captureException(e); } } }
@NgModule({ providers: [{provide: ErrorHandler, useClass: MyErrorHandler}] }) class MyModule {}
まとめ
まとめ - JSのErrorとは別の独自のErrorクラスを作ろ う - Interceptorを使って↑のErrorをThrowしよう - ErrorHandlerを実装して自分好みにError ハンドリングしよう
BizReachでは フロントエンドエンジニア 大募集中です!
ご清聴 ありがとう ございました
ご清聴 ありがとう ございました
ご清聴 ありがとう ございました
おまけ (Error Handlerで ハマったことを 紹介)
handleError(e: any) { if (e instanceof RequestError) { // リクエストエラーが起こってるのにここを通らない
this.showErrorToast(e.message); } } // ↓ handleError(e: any) { if (e.rejection instanceof RequestError) { // rejectionにErrorが入ってることがある this.showErrorToast(e.message); } }
handleError(e: any) { if (e instanceof RequestError) { // トーストが表示されない
this.showErrorToast(e.message); } } // ↓ handleError(e: any) { if (e.rejection instanceof RequestError) { // NgZoneをDIして変更通知してあげる this.ngZone.run(() => this.showErrorToast(e.message)) } }
handleError(e: any) { if (e instanceof RequestError) { // hogeServiceがDIできてない
this.hogeService.hoge(); } } // ↓ handleError(e: any) { if (e.rejection instanceof RequestError) { // Injectorでgetする const hogeService = this.injector.get(HogeService); hogeService.hoge(); } }