Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
HRMOSにおけるAngularのエラーハンドリングについて
Search
deepblue-will
June 13, 2019
Technology
470
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
HRMOSにおけるAngularのエラーハンドリングについて
Angularアプリの簡単・強力なエラーハンドリングの仕組みを紹介します
deepblue-will
June 13, 2019
More Decks by deepblue-will
See All by deepblue-will
5分ぐらいでざっくり紹介するCSS4
deepbluewill
0
39
振り返りのススメ
deepbluewill
0
59
Other Decks in Technology
See All in Technology
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
1
460
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
140
二歩目のフロントエンド・ウェブアクセシビリティ
camiha
2
590
しろおびから始める!ログ活用の第一歩
shumei_ito
0
950
Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
1
580
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
920
分析の民主化を支えるメタデータ整備の実践
kakehashi
PRO
4
1.4k
Active Record Connection Adaptersにおける長年の課題に再び取り組む
yahonda
0
150
Optunaの最新リリースv5.0について
pfn
PRO
0
120
Webの常識が通じないHTMLメールのダークモード
teamlab
PRO
0
120
DGX Spark でどこまでハッキングができるのか?
kash1064
3
1.3k
エンタメ企業のM&Aを支えるデータ基盤 ― 統合から店舗のリアルタイム分析まで / Data Engineering Summit 2026
genda
0
180
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
2
2k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
220
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
730
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.2k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
520
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(); } }