質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

Babel

Babelは、JavaScriptの次世代仕様であるECMAScriptのコンパイラ。次世代の標準機能を用いて記述されたコードを、それらの機能に対応していないブラウザでも動作するコードに変換することができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

4回答

6191閲覧

constへの代入行だけをtry-catchしたい(ES6+Babel)

maisumakun

総合スコア145184

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

Babel

Babelは、JavaScriptの次世代仕様であるECMAScriptのコンパイラ。次世代の標準機能を用いて記述されたコードを、それらの機能に対応していないブラウザでも動作するコードに変換することができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

1グッド

1クリップ

投稿2018/04/09 07:16

編集2018/04/09 07:24

前提・実現したいこと

ES6以上(Babelで変換可能な範囲内)で、「const変数にある関数の実行結果を代入」、そして「関数が例外を投げたら、実行中の関数からも抜ける」を実現したいのです。

発生している問題&書いてみたソースコード

以下のように、いくつかのパターンを考えてみましたが、動くものについてもすっきりしない部分が残ります。

javascript

1function その1() { 2 try { 3 const val = someFunction(); 4 } catch(e) { 5 // 例外処理略 6 return; 7 } 8 // ここでメインの処理…をしようにも、 9 // もうここではvalを使えない 10} 11 12function その2() { 13 let val; 14 try { 15 val = someFunction(); 16 } catch(e) { 17 // 例外処理略 18 return; 19 } 20 // ここでメインの処理 21 // 動くけど、1度しか代入しないのでできればconstで書きたい 22} 23 24function その3() { 25 try { 26 const val = someFunction(); 27 // メインの処理を続ける 28 29 // 動くけど、ネストが深くなる、catchで意図しない例外も拾ってしまうなど、 30 // できればやりたくない 31 } catch(e) { 32 // 例外処理略 33 return; 34 } 35}

補足情報(FW/ツールのバージョンなど)

  • ブラウザ環境(モダンブラウザ、IE11など不特定)、Babel 6.26でトランスパイル
m.ts10806👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

追記:その5で例外をthrowするの忘れてました!コードを追記します。


もっと単純に考えてよいのではないでしょうか?

特に関数の先頭にあるconstへの宣言時に右辺で例外が起きた際に**「その1~その3」などの関数ですべき例外処理があるべきでない**と思います。つまり単に以下でいいのではないでしょうか。

javascript

1function その4() { 2 const var = 例外がおきるかも知れない関数(); 3 ... 4}

もしどうしても「その1~その3」で例外処理をしたいなら以下のようにしては如何でしょうか。

javascript

1function その5() { 2 const var = guard(); 3 ... 4 5 function guard() { 6 try { 7 return 例外がおきるかも知れない関数(); 8 } catch (e) { 9 なにかしたいならここで 10 throw e; 11 } 12 } 13}

投稿2018/04/09 07:30

編集2018/04/09 07:44
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/04/11 04:27

別関数とするのがいちばんスッキリしそうですね、ありがとうございます。
guest

0

エラーを無視するコード

コードの良し悪しは別として、要件を満たすだけなら次のように書くことが可能です。

JavaScript

1'use strict'; 2 3/** 4 * エラーを無視して関数呼び出しする関数 5 */ 6function callFunctionIgnoreError (fn /* [, args, [, thisArg] ] */) { 7 try { 8 return arguments.length < 3 ? fn.apply(null, arguments[1]) : fn.apply(arguments[2], arguments[1]); 9 } catch (error) { 10 return; 11 } 12} 13 14/** 15 * 何か1 16 */ 17function someFunction1 () { 18 throw new Error; 19} 20 21/** 22 * 何か2 23 */ 24function someFunction2 () { 25 return 2; 26} 27 28/** 29 * 実行例 30 */ 31function sample_type4 (fn) { 32 const val = callFunctionIgnoreError(fn); 33 34 if (typeof val === 'undefined') { 35 return; 36 } 37 38 return val; 39} 40 41console.log(sample_type4(someFunction1)); // undefined 42console.log(sample_type4(someFunction2)); // 2

callFunctionIgnoreError() には「エラーが発生せず、undefined 値が返り値になった場合」にエラーの有無を区別できない、という問題があり、返り値を次のいずれかにすれば区別できます。

JavaScript

1[success, returnValue] 2{success, returnValue}

エラーを無視して良いのか

私としては、投げられたエラーを無視して実行する try-catch はアンチパターンと考えています。
実行を継続したいのであれば、someFunction() はエラーが発生しないようにコードを書くべきであり、エラーの有無で実行成否を判断するのが間違っています。
というわけで、関数の返り値で成否を判断するように設計を変える事を提案します。

エラーを無視せざるを得ない場合

とはいえ、例外はあります。
IE7- 向けに XMLHttpRequest のPolyfillを書く場合、new ActiveXObject で代替するのですが、実行成否が例外の有無で判断するしかなかった為、try-catch を利用する必要がありました。
これは私が先人から教えて頂いた方法ですが、当時は新鮮に感じた覚えがあります。

JavaScript

1if (!'XMLHttpRequest' in this) { 2 this.XMLHttpRequest = (function () { 3 var i, l; 4 5 for (i = 0, l = arguments.length; i < l; i++) { 6 try { 7 return arguments[i]; 8 } 9 catch (err) {} 10 } 11 return null; 12 })( 13 function () { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); }, 14 function () { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); }); 15}
このように、**ActiveXObject の設計を変更できないならば**、`try-catch` を利用する価値はあります。 逆にいえば、関数コードが自分のコントロール下にあるなら、設計を見直すべきと私は考えます。 Re: maisumakun さん

投稿2018/04/09 16:14

編集2018/04/09 16:32
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/04/11 04:27

はい、残念ながら呼んでいる関数がライブラリ内のもので、「例外を投げてくる」という前提は受け入れざるを得ない状況でした。
guest

0

今日、この問題を研究して思いついた方法です。

・const受け取り
・意図した通りの例外処理を失敗のすぐ近くに記述
・関数脱出(early return)可能
・ネストが深くならない

のすべてを満たしていると思います。

javascript

1const sugoiMethod = async () => { 2 try { 3 // すべての処理は、このtryの中で行う 4 5 // await-catchならconst受け取りできます! 6 const hoge = await getHoge().catch(e => { 7 ...// hoge取得失敗用の処理はここで 8 throw e;// throw!! early returnしたいのが明白! 9 }); 10 11 // await-catchならconst受け取りできます! 12 const hage = await getHage().catch(e => { 13 ...// hage取得失敗用の処理はここで 14 throw e;// throw!! early returnしたいのが明白! 15 }); 16 17 ...// 成功時の処理をいろいろする 18 return hoge + hage; 19 20 } catch (e) { 21 // early returnするためのthrowを受け取っただけですー。何もしませーん。 22 return null;// お好みのエラーっぽい値を返せばいいさ 23 } 24};

投稿2022/05/18 09:25

zohnam

総合スコア1441

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

よく判らんけれど, 「try-catchせずにエラー判定したい」と仮定してこんな感じ?

JavaScript

1//エラーを握りつぶす関数 2function test(f){ 3 try{ 4 return f(); 5 }catch(e){ 6 return e; 7 } 8} 9 10//エラーの発生有無を戻り値がErrorかどうかで判断 11function a(v){ 12 const val = test(b.bind(null, v)); 13 if(val instanceof Error){return;} 14} 15 16//エラーを発生させるかもしれない関数 17function b(v){ 18 if(v === true){ 19 throw new Error("error"); 20 }else{ 21 return "success"; 22 } 23} 24 25a(true); 26a(false);

何がベストかは判らんけれど, bindを使わないならこうか?

JavaScript

1//エラーを握りつぶす関数 2function test(f, ...arguments){ 3 try{ 4 return f(...arguments); 5 }catch(e){ 6 return e; 7 } 8} 9 10//エラーの発生有無を戻り値がErrorかどうかで判断 11function a(v){ 12 const val = test(b, v); 13 console.log(val); 14 if(val instanceof Error){return;} 15} 16 17//エラーを発生させるかもしれない関数 18function b(v){ 19 if(v === true){ 20 throw new Error("error"); 21 }else{ 22 return "success"; 23 } 24} 25 26a(true); 27a(false);

投稿2018/04/09 07:41

編集2018/04/09 07:46
defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問