Skip to content
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

Merged
merged 19 commits into from
Mar 27, 2024
Merged

feat: ErrorCauseへの対応 #1732

merged 19 commits into from
Mar 27, 2024

Conversation

himanoa
Copy link
Contributor

@himanoa himanoa commented Mar 24, 2024

概要

Issue対応:
fix #1714

  • 例外処理 のセクションの最後に Error Cause の解説を追加します
  • Promiseを活用するのセクションのサンプルコードで Error Cause を使うように変更します

重点的に確認してもらいたい部分

  • Error Causeのセクションにおいて、causeプロパティで原因のエラーを取得できる部分の解説をコードブロック内に閉じ込めてしまったが、ちゃんと前の文章で表現したほうが良いか
  • causeプロパティにアクセスして console.error を呼び出す部分で 詳細 という単語を使っているか妥当かどうか。
    • 他に考えられるとすると 原因 要因 etc...

Preview

TODO

@bot-user
Copy link

bot-user commented Mar 24, 2024

Deploy Preview for js-primer ready!

Name Link
🔨 Latest commit 89bb9de
🔍 Latest deploy log https://app.netlify.com/sites/js-primer/deploys/66040e0aab3b7f0008d4a404
😎 Deploy Preview https://deploy-preview-1732--js-primer.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

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})`);
Copy link
Collaborator

@azu azu Mar 24, 2024

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はオプショナルなので、全てのエラーに存在するわけじゃないため、何かしら判定して出すかブラウザ側に任せるのが正しい気はします)


image

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は省略していいかなーとは思いました。

image

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

承知しました!削除します

source/use-case/ajaxapp/promise/README.md Outdated Show resolved Hide resolved
source/use-case/ajaxapp/promise/README.md Outdated Show resolved Hide resolved
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 スクリーンショットは、後でここにまとめて撮り直す。

https://github.com/asciidwango/js-primer/blob/master/source/basic/error-try-catch/screenshot-manual.sh

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このシェルスクリプトは僕の環境で実行してコミットにスクリーンショット付ける形で大丈夫ですか?

Copy link
Contributor Author

@himanoa himanoa Mar 25, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これ、手元にmacOSマシンがなくて実行できなさそうでした 🙇

Copy link
Collaborator

@azu azu Mar 25, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

スクショは統一感が大事だと思うので(OSでUIが異なる)、一旦そのままで大丈夫ですー

source/basic/error-try-catch/README.md Outdated Show resolved Hide resolved
source/basic/error-try-catch/README.md Outdated Show resolved Hide resolved
source/basic/error-try-catch/README.md Outdated Show resolved Hide resolved
エラーをキャッチし新しいメッセージや別の `Error` オブジェクトで送出すると、デバッグに有益な情報をエラーに付与することできて便利です。
これを実現する時に、新しく `Error` オブジェクトを作成して `throw` すると元のエラーのスタックトレースが失われてしまいます。

この問題を解決するには、`catch` 句で補足した変換元の例外を、新しい `Error` オブジェクトのコンストラクタに渡すことで、変換元のエラーのスタックトレースを保持することができます。
Copy link
Collaborator

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というのを何というかちょっと難しい。。

  • 元々のエラー
  • キャッチしたエラー
  • 補足したエラー

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

補足したエラーかキャッチしたエラーが、指している対象が明確になっていて良いと感じました。

このファイルの一貫性重視でキャッチしたエラーを使おうと思います

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

散らかすようですが「本来のエラー」という言い方もできそうです。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本来のエラーは結構しっくり来るので、その方針にしようとおもいます!

@azu azu requested a review from lacolaco March 24, 2024 09:12
source/basic/error-try-catch/README.md Outdated Show resolved Hide resolved
}

// 数値の文字列を受け取り数値を返す関数
// 'text' など数値にはならない文字列を渡された場合は例外を送出する
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// 'text' など数値にはならない文字列を渡された場合は例外を送出する
// 'text' など数値にはならない文字列を渡された場合は例外を投げる

source/basic/error-try-catch/README.md Outdated Show resolved Hide resolved
} catch (err) {
console.error(`エラーが発生しました (${err})`);
// `cause` プロパティを参照することで、throwする時に `cause` で渡したエラーにアクセスすることができる
console.error(`詳細 (${err.cause})`);
Copy link
Collaborator

@azu azu Mar 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

エラーの発生元?とかですかね? ( 実はcauseはなんでも入れられるのでなんでもアリだと思いますが)

Suggested change
console.error(`詳細 (${err.cause})`);
console.error(`エラーの発生元 (${err.cause})`);

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

発生元というとどこで投げられたのかという「場所」のイメージをもたせそうですがそれはスタックトレースの情報なので、「原因」のニュアンスが与えられるほうがいいんじゃないかと思います。

Copy link
Contributor Author

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丸々削ってしまってもいいのではないかと思いました。

@azu
Copy link
Collaborator

azu commented Mar 24, 2024

@himanoa 新しい文章が増える形になるのでContributor License Agreement(CLA)へのサインお願いします 🙏

See. asciidwango#1732 (comment)

Co-authored-by: azu <azu@users.noreply.github.com>
Copy link
Collaborator

@lacolaco lacolaco left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

一通り読みました!

source/basic/error-try-catch/README.md Outdated Show resolved Hide resolved
source/basic/error-try-catch/README.md Outdated Show resolved Hide resolved
} catch (err) {
console.error(`エラーが発生しました (${err})`);
// `cause` プロパティを参照することで、throwする時に `cause` で渡したエラーにアクセスすることができる
console.error(`詳細 (${err.cause})`);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

発生元というとどこで投げられたのかという「場所」のイメージをもたせそうですがそれはスタックトレースの情報なので、「原因」のニュアンスが与えられるほうがいいんじゃないかと思います。

himanoa and others added 4 commits March 24, 2024 20:26
Co-authored-by: Suguru Inatomi <suguru.inatomi@gmail.com>
Co-authored-by: azu <azu@users.noreply.github.com>
@himanoa
Copy link
Contributor Author

himanoa commented Mar 24, 2024

一旦修正方法が自明な部分だけ直しました

@himanoa himanoa requested review from azu and lacolaco March 25, 2024 15:12
@himanoa
Copy link
Contributor Author

himanoa commented Mar 26, 2024 via email

Co-authored-by: azu <azu@users.noreply.github.com>
Copy link
Collaborator

@azu azu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

コメントしたところ以外はLGTM

source/basic/error-try-catch/README.md Outdated Show resolved Hide resolved
}
```

この問題を解決するには、`catch` 句で補足した本来のエラーを、新しい `Error` オブジェクトのコンストラクタに渡すことで、スタックトレースを引き継ぐことができます。
Copy link
Collaborator

@azu azu Mar 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#1732 (comment)
ここで書いたように cause オプション に渡すというのを文章で説明する必要があると思います。
そうしないとcauseオプションがいきなりコードに出てきてしまってるので、驚き最小の原則の反してしまう。
(コードを読む前に、コードに書かれている想像できるような説明を書くイメージ)

Copy link
Contributor Author

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>
@himanoa himanoa requested a review from azu March 26, 2024 09:43
Copy link
Collaborator

@azu azu left a 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/

流れで読んでちょっと気になった部分をコメントしました。
他は大丈夫そうです。

Comment on lines 1 to 20
// 数字の文字列を二つ受け取り、合計を返す関数
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;
}
Copy link
Collaborator

@azu azu Mar 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

safeParseIntとsafeParseIntは順番逆にした方が良い気はします。
既知 → 未知の順番にしたいので。

source/basic/error-try-catch/src/error-cause/index.js Outdated Show resolved Hide resolved
@himanoa himanoa requested a review from azu March 27, 2024 12:16
Copy link
Collaborator

@azu azu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

ありがとうございました!

@azu azu merged commit 76dd4c1 into asciidwango:master Mar 27, 2024
8 checks passed
@himanoa
Copy link
Contributor Author

himanoa commented Mar 27, 2024

@azu @lacolaco
手厚いレビューありがとうございました~! 🙌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

ES2022: Error Cause
4 participants