throw されないようにする
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ 1 処理ごとに try-catch して個別の処理したいときは面倒
◆ const にできないし事前に let で変数用意しないといけない
◆ 変数準備⇨ try 中に用意した変数に代入⇨エラーなら処理 というのが見づらい
◆ →エラーが起きても結果を通常の return をする関数を作る
◆ エラーを判断して return とかもできる
◆ const にできないし事前に let で変数用意しないといけない
◆ 変数準備⇨ try 中に用意した変数に代入⇨エラーなら処理 というのが見づらい
◆ →エラーが起きても結果を通常の return をする関数を作る
◆ エラーを判断して return とかもできる
エラーが出るかもしれないところは通常 try-catch を使うものですが 毎回 try-catch のステートメントが入るのは結構邪魔です
まとまりを実行したらどこでエラーがあってもまとめて受け取ればいいなら良いのですが それぞれのエラー時に個別の処理をしたいときには扱いづらいです
例えばこういう感じです
関数実行ごとに try-catch が必要だったり その後に try 中に作った変数を使うなら let にしてあとから代入する必要があります
せめて do 式があれば
行は少し増えてますが const にできますし ひとつのインデントブロックに収まるので見やすさ的には少しマシなのですけどね
ただ 求めてるのは実行したら throw されずにエラーが出たことを結果として受け取れるものです
Node.js のコールバック式のエラー検知はこういうシーンでは扱いやすいです
そのあたりも参考にこういう JavaScript ファイルを用意することにしました
使い方はこういうものです
safeTry はコールバック関数を実行して エラーがあっても普通に結果を返して throw はしません
エラーがあった場合は error_symbol シンボルがキーのプロパティにエラーオブジェクトが入ったオブジェクトを返します
エラーじゃない場合は普通に結果を返します
プロパティがあればエラーと言う判断基準です
文字列だと重複がありえるのでシンボルをキーにしています
もうひとつ Node.js のコールバックを参考にした safeTryArray もあります
こっちは結果を [error, result] 形式の配列で返します
エラーがあれば 1 つ目の要素に入り 成功したら 1 つ目は null で 2 つ目に結果です
これまでに作ったものに try-catch を式化するものがありましたが あっちは Promise の then/catch のようにエラー時は別のコールバック関数を使うようにしていました
それだと return がそのコールバック関数が対象となって 元の try の処理を実行したかった関数を return できないのでエラーの場合も結果を返してそこから if するのが今回との違いです
できれば関数実行じゃなく try みたいなブロックでできればいいのですが 流石に現状では無理そうです
一応 ステージ 1 の提案段階の Block params を使えば
と できるようなのでこの機能も速く実装されてほしいです
ただ この機能って return どうなるんでしょう
動きは指定した関数名にコールバック関数を渡して実行するもので {} ブロックの中身をコールバック関数の中身として扱うようです
ですが 見た目はどうみても try や for みたいに文で return すると外側関数が return されそうです
でも実態は {} が関数なので {} の中が対象になってほしいです
まだステージ 1 ですし議論対象みたいなので実装される頃にどうなってるかはわかりませんが 値を返せるようにはなってほしいです
まとまりを実行したらどこでエラーがあってもまとめて受け取ればいいなら良いのですが それぞれのエラー時に個別の処理をしたいときには扱いづらいです
例えばこういう感じです
let x
try{
x = mayError()
}catch(err){
// something
return null
}
let y
try{
y = mayError2()
}catch(err){
//
}
関数実行ごとに try-catch が必要だったり その後に try 中に作った変数を使うなら let にしてあとから代入する必要があります
せめて do 式があれば
const x = do {
try{
mayError()
}catch(err){
// something
return null
}
}
行は少し増えてますが const にできますし ひとつのインデントブロックに収まるので見やすさ的には少しマシなのですけどね
ただ 求めてるのは実行したら throw されずにエラーが出たことを結果として受け取れるものです
Node.js のコールバック式のエラー検知はこういうシーンでは扱いやすいです
そのあたりも参考にこういう JavaScript ファイルを用意することにしました
const error_symbol = Symbol("error")
const safeTry = fn => {
try {
return fn()
} catch (err) {
return { [error_symbol]: err, error: true }
}
}
const safeTryArray = fn => {
try {
return [null, fn()]
} catch (err) {
return [err, null]
}
}
export default safeTry
export { error_symbol, safeTryArray }
使い方はこういうものです
import safeTry, { error_symbol, safeTryArray } from "./safe-try.js"
const result = safeTry(() => {
return 1
})
if (result[error_symbol]) {
// something
return null
}
const [err, result2] = safeTryArray(() => {
return 2
})
if (err) {
// something
return null
}
safeTry はコールバック関数を実行して エラーがあっても普通に結果を返して throw はしません
エラーがあった場合は error_symbol シンボルがキーのプロパティにエラーオブジェクトが入ったオブジェクトを返します
エラーじゃない場合は普通に結果を返します
プロパティがあればエラーと言う判断基準です
文字列だと重複がありえるのでシンボルをキーにしています
もうひとつ Node.js のコールバックを参考にした safeTryArray もあります
こっちは結果を [error, result] 形式の配列で返します
エラーがあれば 1 つ目の要素に入り 成功したら 1 つ目は null で 2 つ目に結果です
これまでに作ったものに try-catch を式化するものがありましたが あっちは Promise の then/catch のようにエラー時は別のコールバック関数を使うようにしていました
それだと return がそのコールバック関数が対象となって 元の try の処理を実行したかった関数を return できないのでエラーの場合も結果を返してそこから if するのが今回との違いです
できれば関数実行じゃなく try みたいなブロックでできればいいのですが 流石に現状では無理そうです
一応 ステージ 1 の提案段階の Block params を使えば
const [err, result] = safeTryArray { return fn() }
と できるようなのでこの機能も速く実装されてほしいです
ただ この機能って return どうなるんでしょう
動きは指定した関数名にコールバック関数を渡して実行するもので {} ブロックの中身をコールバック関数の中身として扱うようです
ですが 見た目はどうみても try や for みたいに文で return すると外側関数が return されそうです
でも実態は {} が関数なので {} の中が対象になってほしいです
まだステージ 1 ですし議論対象みたいなので実装される頃にどうなってるかはわかりませんが 値を返せるようにはなってほしいです