-
-
Notifications
You must be signed in to change notification settings - Fork 224
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: ErrorCauseへの対応 #1732
feat: ErrorCauseへの対応 #1732
Conversation
✅ Deploy Preview for js-primer ready!
To edit notification comments on pull requests, go to your Netlify site configuration. |
@@ -82,6 +82,7 @@ function main() { | |||
.catch((error) => { | |||
// Promiseチェーンの中で発生したエラーを受け取る | |||
console.error(`エラーが発生しました (${error})`); | |||
console.error(`詳細 (${error.cause})`); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
error
自体のログにcauseを含むスタックトレースが入ってるので、明示的にcauseを参照する必要性はないかなと思います。
エラーキャッチする側が.cause
が存在しているかを知ってるのはおかしいと思うので、console.error(error.cause)
と書くケースは実際にはないかなとは思っています。
(.cause
はオプショナルなので、全てのエラーに存在するわけじゃないため、何かしら判定して出すかブラウザ側に任せるのが正しい気はします)
Cause is displayed in console
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause
まだFirefoxだけだったのか。。(意外)
Node.jsは独自で対応してたのか。
ChromeもCanary版ではサポートしてたので、.cause
は省略していいかなーとは思いました。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
承知しました!削除します
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
📝 スクリーンショットは、後でここにまとめて撮り直す。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
このシェルスクリプトは僕の環境で実行してコミットにスクリーンショット付ける形で大丈夫ですか?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
これ、手元にmacOSマシンがなくて実行できなさそうでした 🙇
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
スクショは統一感が大事だと思うので(OSでUIが異なる)、一旦そのままで大丈夫ですー
エラーをキャッチし新しいメッセージや別の `Error` オブジェクトで送出すると、デバッグに有益な情報をエラーに付与することできて便利です。 | ||
これを実現する時に、新しく `Error` オブジェクトを作成して `throw` すると元のエラーのスタックトレースが失われてしまいます。 | ||
|
||
この問題を解決するには、`catch` 句で補足した変換元の例外を、新しい `Error` オブジェクトのコンストラクタに渡すことで、変換元のエラーのスタックトレースを保持することができます。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
このスタックトレースが失われる問題を解決するには、ES2022で追加されたErrorの`cause`オプションが利用できます。
新しいエラーオブジェクトを作成する際に、第2引数の`cause`オプションに元々?のエラーオブジェクトを渡すことで、のスタックトレースを保持できます。
という感じですかね。
Original Errorというのを何というかちょっと難しい。。
- 元々のエラー
- キャッチしたエラー
- 補足したエラー
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
補足したエラーかキャッチしたエラーが、指している対象が明確になっていて良いと感じました。
このファイルの一貫性重視でキャッチしたエラーを使おうと思います
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
散らかすようですが「本来のエラー」という言い方もできそうです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
本来のエラーは結構しっくり来るので、その方針にしようとおもいます!
} | ||
|
||
// 数値の文字列を受け取り数値を返す関数 | ||
// 'text' など数値にはならない文字列を渡された場合は例外を送出する |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// 'text' など数値にはならない文字列を渡された場合は例外を送出する | |
// 'text' など数値にはならない文字列を渡された場合は例外を投げる |
} catch (err) { | ||
console.error(`エラーが発生しました (${err})`); | ||
// `cause` プロパティを参照することで、throwする時に `cause` で渡したエラーにアクセスすることができる | ||
console.error(`詳細 (${err.cause})`); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
エラーの発生元?とかですかね? ( 実はcauseはなんでも入れられるのでなんでもアリだと思いますが)
console.error(`詳細 (${err.cause})`); | |
console.error(`エラーの発生元 (${err.cause})`); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
発生元というとどこで投げられたのかという「場所」のイメージをもたせそうですがそれはスタックトレースの情報なので、「原因」のニュアンスが与えられるほうがいいんじゃないかと思います。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(.causeはオプショナルなので、全てのエラーに存在するわけじゃないため、何かしら判定して出すかブラウザ側に任せるのが正しい気はします)
#1732 (comment)
の観点を考えると L320-L321丸々削ってしまってもいいのではないかと思いました。
See. asciidwango#1732 (comment) Co-authored-by: azu <azu@users.noreply.github.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
一通り読みました!
} catch (err) { | ||
console.error(`エラーが発生しました (${err})`); | ||
// `cause` プロパティを参照することで、throwする時に `cause` で渡したエラーにアクセスすることができる | ||
console.error(`詳細 (${err.cause})`); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
発生元というとどこで投げられたのかという「場所」のイメージをもたせそうですがそれはスタックトレースの情報なので、「原因」のニュアンスが与えられるほうがいいんじゃないかと思います。
Co-authored-by: Suguru Inatomi <suguru.inatomi@gmail.com>
Co-authored-by: azu <azu@users.noreply.github.com>
一旦修正方法が自明な部分だけ直しました |
承知です!修正します!
|
Co-authored-by: azu <azu@users.noreply.github.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
コメントしたところ以外はLGTM
} | ||
``` | ||
|
||
この問題を解決するには、`catch` 句で補足した本来のエラーを、新しい `Error` オブジェクトのコンストラクタに渡すことで、スタックトレースを引き継ぐことができます。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
#1732 (comment)
ここで書いたように cause
オプション に渡すというのを文章で説明する必要があると思います。
そうしないとcause
オプションがいきなりコードに出てきてしまってるので、驚き最小の原則の反してしまう。
(コードを読む前に、コードに書かれている想像できるような説明を書くイメージ)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
なるほどー修正します!
Co-authored-by: azu <azu@users.noreply.github.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
https://deploy-preview-1732--js-primer.netlify.app/basic/error-try-catch/
流れで読んでちょっと気になった部分をコメントしました。
他は大丈夫そうです。
// 数字の文字列を二つ受け取り、合計を返す関数 | ||
function sumNumStrings(a, b) { | ||
try { | ||
const aNumber = safeParseInt(a); | ||
const bNumber = safeParseInt(b); | ||
return aNumber + bNumber; | ||
} catch (e) { | ||
throw new Error("Failed to sum a and b", { cause: e }); | ||
} | ||
} | ||
|
||
// 数値の文字列を受け取り数値を返す関数 | ||
// 'text' など数値にはならない文字列を渡された場合は例外を投げられる | ||
function safeParseInt(numStr) { | ||
const num = parseInt(numStr, 10); | ||
if (Number.isNaN(num)) { | ||
throw new Error(`${numStr} is not a numeric`); | ||
} | ||
return num; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
safeParseIntとsafeParseIntは順番逆にした方が良い気はします。
既知 → 未知の順番にしたいので。
Co-authored-by: azu <azu@users.noreply.github.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
ありがとうございました!
概要
Issue対応:
fix #1714
Error Cause
の解説を追加しますError Cause
を使うように変更します重点的に確認してもらいたい部分
console.error
を呼び出す部分で 詳細 という単語を使っているか妥当かどうか。Preview
TODO