質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

2回答

2630閲覧

TypeScriptの例外処理を強制させる方法について

hwmyn612

総合スコア9

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2021/08/05 20:32

編集2021/08/05 20:35

前提・実現したいこと

TypeScriptの例外処理を強制させる方法について教えてください。

書籍「プログラミングTypeScript――スケールするJavaScriptアプリケーション開発」

上記の書籍にやり方が書かれていたのですが、実際試すと強制させることをうまく実現させることができません。
上記の書籍の例外の章に以下のような説明が書かれていました。

TypeScript

1function parse( 2 birthDay: string 3): Date | InvalidDateFormatError | DateIsInTheFutureError { 4 let date = new Date(birthDay); 5 if (!isValid(date)) { 6 **throw** new InvalidDateFormatError("形式は yyyy/MM/ddにしてください"); 7 } 8 if (date.getTime() > Date.now()) { 9 **throw** new DateIsInTheFutureError("未来の日付です"); 10 } 11 return date; 12}

上記のソースコードにおいて、ifがtrueの時(エラーの際)、例外を発生させるというプログラムだが、
・throw new InvalidDateFormatError("形式は yyyy/MM/ddにしてください");
というthrow文だと呼び出しもとでtry/catchを書かなければプログラムが途中で止まってしまう。
ただ呼び出しもとでtry/catchを強制させることができない。

そのためthrowではなく以下のようにreturnを使うべきだとのこと。

TypeScript

1function parse( 2 birthDay: string 3): Date | InvalidDateFormatError | DateIsInTheFutureError { 4 let date = new Date(birthDay); 5 if (!isValid(date)) { 6 return new InvalidDateFormatError("形式は yyyy/MM/ddにしてください"); 7 } 8 if (date.getTime() > Date.now()) { 9 return new DateIsInTheFutureError("未来の日付です"); 10 } 11 return date; 12}

・TypeScriptはJavaではないためthrows節はサポートしていないため例外処理を強制させるために
上記のソースコードのようにthrowではなく、returnで例外を返すようにすると、呼び出しもとでは、
全ての例外を処理する処理を書かなければコンパイル時にTypeErrorとなる

【質問】
やりたいことは、上記のparse()関数でエラーが発生した(if文の条件がtrueの)際に、例外をthrowし、
呼び出しもとで例外処理を強制させたいです。(呼び出しもとで例外処理をしていないとコンパイルエラーにしたい)
上記のように書いてもそれができないため、その方法をご教授いただけませんでしょうか。

発生している問題・エラーメッセージ

実際に書籍に書かれているコードを試しましたが(下記に記載されているコード)、
書籍に書かれているような例外を処理する処理を書いていなくてもTypeError(コンパイルエラー)に
なることがない。

コンパイルエラーにならない

該当のソースコード

TypeScript

1class InvalidDateFormatError extends RangeError {} 2class DateIsInTheFutureError extends RangeError {} 3 4function parse( 5 birthDay: string 6): Date | InvalidDateFormatError | DateIsInTheFutureError { 7 let date = new Date(birthDay); 8 if (!isValid(date)) { 9 return new InvalidDateFormatError("形式は yyyy/MM/ddにしてください"); 10 } 11 if (date.getTime() > Date.now()) { 12 return new DateIsInTheFutureError("未来の日付です"); 13 } 14 return date; 15} 16 17function isValid(date: Date) { 18 return ( 19 Object.prototype.toString.call(date) === "[object Date]" && 20 !Number.isNaN(date.getTime()) 21 ); 22} 23 24let result = parse("2979/07/27"); 25console.log(result); 26

試したこと

実際に書籍発行元のオライリーに問い合わせをしているのですが、
一向に返信をいただけず、こちらに質問させていただくことにしました。

お願い致します。

補足情報(FW/ツールのバージョンなど)

VSCode

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/08/06 23:09

> 呼び出しもとでは、 全ての例外を処理する処理を書かなければコンパイル時にTypeErrorとなる 呼び出し元で switch を使っていませんか?
hwmyn612

2021/08/07 00:48

Zuishin様 ありがとうございます。 いいえ。一応全ソースコードを掲載させていただいているのですが、switchは使用しておりません。 switchを使用していることで何かが変わることがありますでしょうか。 もし引き続きアドバイスがある場合のみお願い致します。
Zuishin

2021/08/07 00:52

> もし引き続きアドバイスがある場合のみお願い致します。 その本の意図に心当たりはあるが、教える気はなくなった。 余計な返信は無用。
hwmyn612

2021/08/07 00:55

承知しました。申し訳ございませんでした。
Zuishin

2021/08/07 00:57

何が申し訳なかったかをちゃんと確定し、今後の対応策を約束するのが謝罪なので、社会人になりたいなら覚えておくように。
hwmyn612

2021/08/07 01:12 編集

アドバイスありがとうございます。 私としましては、私の質問に対して わざわざ時間を使って回答をしてくださったためとても感謝しておりました。 そのため、こちらから回答に対して 「switchを使用していることで何かが変わることがありますでしょうか。」 という質問をして回答を強制させることは避けたかったという意図があります。 そのため、もし更に時間を使ってアドバイスいただける場合はお願いしたという意図がありました。 伝わらず申し訳ありませんでした。 今後は意図が伝わるような書き方ができるよう気をつけます。 この度はご回答ありがとうございました。
guest

回答2

0

ベストアンサー

呼び出し元に try を強制させる機能を持ったプログラミング言語というのは私の知る限り存在しません(Haskell のモナドで近いことはできそうですが)。どの関数が例外を出しうるかは型定義に現れることはありませんので自分で調べておくしか方法がありません。もちろん型定義に現れないということはコンパイラで例外をキャッチしているかどうかを確かめるすべがないということです。

基本的に例外は使わず、組み込みの関数で例外を発生させるものについては自分で気をつけ、必要であれば例外をラップして型でエラーを表す方法を取るといいでしょう。

投稿2021/08/06 03:42

A_kirisaki

総合スコア2853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hwmyn612

2021/08/06 19:22

ご回答ありがとうございます。 私は長年Javaを使用していまして、Exceptionクラスを継承した例外オブジェクトを、throwsを使って呼び出し元に投げると、呼び出し元にtryを強制させることができていました。 そのため、throwsが存在しないTypeScriptでも同様のことはできないかということを模索していました。 結論A_kirisaki様がおっしゃる通りできなさそうですね。 オライリーの書籍に対する私の読解力不足か、誤植として受け止めたいと思います。 ありがとうございました!
guest

0

書籍に書かれているような例外を処理する処理を書いていなくてもTypeError(コンパイルエラー)に

なることがない。

そのまま受け取ることはできますが、何もせずにDateとして使うことはできません。

投稿2021/08/05 22:18

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/08/05 23:37 編集

console.logはどんな値でも受け取れるので、例外オブジェクトが入っていようがそのまま通りますが、このようなメソッドは例外的です。
hwmyn612

2021/08/06 19:20

ご回答いただきましてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問