◆ try-catch はブロックスコープのせいで let 宣言してあとから代入にしないといけない
◆ const にできるようにするものを何度か作ってたけど Promise でいい気がした
◆ 同じことできるし標準の機能でできるから良さそうだけど非同期処理になってしまう
◆ 不要な非同期は問題の元なのでやめたほうがいいかも


これまでも何度か(1)(2)書いてますが try-catch に関してはブロックスコープが邪魔です

全体を囲んでしまうとどこのエラーかがわかりづらくなるので エラーが起きることがある場所のみ囲んで専用の処理をしたいです
しかし そうすると try 句中で得られた値はそのブロックスコープで消えてしまいます
外に出すには外部で宣言しておいたミュータブル変数に入れることになります

let value
try{
value = mayerror()
}catch{
return null
}

value.something()
// ...

この try だけのために let にするのが嫌で仕方ないです
初期値から変更することがある場合にのみ let にしたくて 初期値入れるのがあとになるだけで初期値入れてから変更しないものは const であってほしいです
これのために

const value = tryCatch(..., ...)
const value = exTry(...).catch(...)

こういう感じで書ける機能を作っていたのですが 上の例の下側を見るとなんか Promise でいい気がしてきました

const value = await new Promise(...).catch(...)

似てます
Promise のコールバックでは結果は 第一引数としてわたされるコールバック関数 (resolve) に入れて呼び出す必要がありますが これまでの方法と大差ないです

const value = await new Promise(r => r(mayerror())).catch(err => null)

これなら自作関数入れなくてもどこでも使える と思ったのですが 非同期処理になってしまうという問題があります
それに await を使うので async 関数にしないといけないです
無意味に非同期化するのは余計な問題の元でもあるのでやっぱり同期的に実行する自作のもののほうがいいのかもしれません

do 式があればこのスコープ問題も消えるのですけどねぇ
早くこないかなー