見かけた PHP のコードに Safe 版関数を使っているものがありました
使っているライブラリはこれのようです
https://github.com/thecodingmachine/safe
Safe 版ってなにしてるの?
文字数が長すぎるとか引数チェックをして脆弱性の対処をこのレイヤーでやってくれるの?
とか思っていたら単にエラーの場合に throw してくれるだけのようです
中身を見ても単純なものです
json_encode
https://github.com/thecodingmachine/safe/blob/v2.4.0/generated/json.php#L50
mkdir
https://github.com/thecodingmachine/safe/blob/v2.4.0/generated/filesystem.php#L1221
PHP の組み込み関数は例外を起こさず false を返して失敗を伝えるのが多いですからね
昔はその仕様に不満を感じて例外を投げてくれればいいのにと思ったこともあります
でも最近は逆で例外を投げられると catch が面倒なので return として成功と失敗を返してほしいと思ってます
JavaScript だと PHP と違いエラーが throw されるので自分でラップしてエラーでも return するようにしたりしてたりします
非同期関数だと 「.catch(error => null)」 とか 「.catch(error => ({ error }))」 で済むのに同期関数は try-catch 句が必要で const と相性が悪くてイライラしたり……
言語によっては例外というものがなく 成功/失敗という型の中に結果や原因を保持してそれを return するものもありますし PHP のこれはこれでいいものだと思います
例外が起きても ちゃんと作るなら生のエラーメッセージをそのまま使わずユーザーが見れる形のメッセージに置き換えたりといった処理が必要で catch して書き換えて 再 throw したりするなら throw はユーザーがするものとしてライブラリレイヤーでは想定されたエラーでは例外は起こさないのほうがいいのかなと思ったりです
◯ 詳細なし
単純に Error のインスタンスを作って throw
◯ assign
エラー処理などに使う補足のデータを含めたいとき
プロパティとして Error オブジェクトに追加する
◯ object
Error オブジェクトと補足情報を別々にもつオブジェクトを throw する
throw 対象は Error オブジェクトじゃなくてもいい
◯ custom error type
ちゃんとした作りにするなら Error を継承したそれ用の型を作るのがたぶん適切
異なる型なので特別なプロパティを持ってそうということが伝わるし instanceof で種別判定もできる
◯ no error object
Error オブジェクトは特に必須じゃない
スタックトレースが要らないなら省いてもいい
単純に Error のインスタンスを作って throw
throw new Error("aa")
◯ assign
エラー処理などに使う補足のデータを含めたいとき
プロパティとして Error オブジェクトに追加する
throw Object.assign(new Error("aa"), { detail: "xxxx" })
◯ object
Error オブジェクトと補足情報を別々にもつオブジェクトを throw する
throw 対象は Error オブジェクトじゃなくてもいい
throw { error: new Error("aa"), detail: "xxxx" }
◯ custom error type
ちゃんとした作りにするなら Error を継承したそれ用の型を作るのがたぶん適切
異なる型なので特別なプロパティを持ってそうということが伝わるし instanceof で種別判定もできる
class AaError extends Error {
constructor(message, detail) {
super(message)
this.detail = detail
}
}
throw new AaError("aa", "xxxx")
◯ no error object
Error オブジェクトは特に必須じゃない
スタックトレースが要らないなら省いてもいい
throw { error: "aa", detail: "aa-error" }