include/function 内の Throw()<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />多くのスクリプトで使用されるコードがあるため、それをインクルード ファイルに転送しました。このコードはチェックを行い、失敗した場合はスローします。ただし、インクルード内で実行されているスクリプトのみを強制終了し、その後、最初にインクルードを呼び出したコードを選択して実行を開始することがわかりました。この種の行為を私はソフトキルと呼ぶつもりです。「両方の」スクリプトを強制終了するには、含まれている throw() が必要です。
ソフトキルは他の言語では一般的ですが、関数内で実行されるため、コードの一部をサイレントに失敗させることができます。ただし、関数内の throw() は実際には実行中のすべてのスクリプトをハードキルするようです。
例:
throwTest.jsl
印刷する( 「あ」 ) ;
含む( 「~パス\throwTest.include.jsl」 ) ;
印刷する( 「D」 ) ;
スローテスト=関数({} 、 {デフォルトのローカル} 、
印刷する( 「え」 ) ;
投げる() ;
印刷する( 「ふ」 ) ;
) ;
スローテスト() ;
印刷する( 「ぐ」 ) ;
throwTest.include.jsl
印刷する( 「B」 ) ;
投げる() ;
印刷する( 「C」 ) ;
ログ出力:
「A」「B」「D」「E」
付属のスクリプト内から JSL をハードキルする方法を知っている人はいますか?
Re: include/function 内の Throw()素晴らしいです、ありがとうクレイジ@JMP !それではJMP13を楽しみにしています。
Re: include/function 内の Throw()JMP 13 (9 月予定) ではこれに対処しています。修正するには、include の前後に try(...) を追加する必要があります。(try は 12.2 のインクルードからのスローをキャッチしません)。try がなければ、JMP 13 は 12.2 と同じように動作します。
JMP 13:
Print("A");
試す( Include("$desktop\throwTest.include.jsl"), print("キャッチ")) ;
Print("D");
throwTest = Function({}, {デフォルトローカル},
Print("E");
投げる();
Print("F");
);
throwTest();
Print("G");
「A」「B」「キャッチ」「D」「E」
Re: include/function 内の Throw()私は物事の見方が違います。
「たくさんのこと」、「さまざまなタイプの関数」を実行したいだけであれば、1 つのスクリプトに多くの関数を入れることを妨げるものはありません。スクリプト全体をスローせずに、エラー チェックを行ったり、関数の実行を停止したりすることもできます。 -- 以下の Return() スクリプトを参照してください。
インクルードの目的は、まったく同じスクリプトをコーディングする回数を減らすことです。
100 個の異なるスクリプトがあり、そのすべてで a=1 が定義されているとします。 b=2; c=3; ... zz=702 まで、これを 100 回もすべて入力する必要はありません。インクルードがない場合は、一度入力して、コピーして他のスクリプトに貼り付けることになるでしょう。しかし、将来的にバグが見つかったらどうなるでしょうか?100 個のスクリプトを作成し、手動でコードを修正する必要があります。退屈な仕事。しかし、これらすべての変数を定義する同じタスクをより迅速に実行する方法を見つけた場合はどうなるでしょうか?すべてのスクリプトにわたってコードを 100 回リファクタリングする必要があります。実際に a=2 が必要だと判断した場合はどうなるでしょうか。 b=3...など。コードを 100 回変更する必要があります。100 個のスクリプトを変更するのはエラーが発生しやすい作業です。スクリプトを見逃したり、間違った変更を加えたりした場合はどうなるでしょうか?
インクルードの目的は、スレーブを殺してマスターを救うことができるスレーブ/マスター関係を作成することではありません。そのための機能を用意しています。インクルードの目的は、コーディング時間を節約することです。
(注: インクルードのもう 1 つの目的は、スクリプト言語を分離して、デバッグを容易にし、コードをクリーンに保つことです。インクルードは、HTML/CSS/JavaScript を使用した Web アプリケーションで特に役立ちますが、これは実際には JSL には当てはまりません。)
チェック変数を渡すと、多くはありませんが、いくつかの問題が発生します。別のスクリプトが同じチェック変数を使用した場合はどうなるでしょうか?チェック変数を変更する場合はどうすればよいですか?チェック変数を間違って入力した場合はどうなりますか? いずれの場合も、throwTest.include をインクルードしたすべてのスクリプトを見つけて、チェック変数が正しく編集される必要があります。これでは、そもそも include を使用する目的が無効になります。
Re: include/function 内の Throw()更新します。なぜ昨夜これを思いつかなかったのかはわかりませんが、return() ステートメントを早めに送信すると、効果的に関数がスローされます。これは他の言語でもよくあることです。
スローテスト=関数({} 、 {デフォルトのローカル} 、
印刷する( 「え」 ) ;
戻る() ;
印刷する( 「ふ」 ) ;
) ;
スローテスト() ;
印刷する( 「ぐ」 ) ;
出力:
「え」「ぐ」
Re: include/function 内の Throw()上記の方法は「インクルードを使用する目的を損なう」というあなたの意見には同意しません。
組み込まれたコードは、非常に多くの異なるタイプの関数を実行し、データ クレンジングや変換などの多くのことを行うことができます。組み込まれたコード内で無効な使用例が発見された場合は、アプリケーション全体をシャットダウンする必要があるかもしれません。したがって、含まれているコードをスローし、実行がメイン コードに戻されるときに、失敗状況が検出されたことを検出して、メイン スクリプトをスローする必要があります。
Re: include/function 内の Throw()これは簡単な回避策ですが、インクルードを使用する目的を実際に無効にします。
Re: include/function 内の Throw()チェック変数を介して情報を渡し、メイン スクリプトでアクションを実行するだけでこの問題を解決できると思います。
デフォルトの名前はここにあります( 1 ) ;
含む( 「C:\Users\txjim\Documents\JMP\throwTest.include.jsl」 ) ;
もしも( 投げて== 1 、投げる()) ;
印刷する( 「D」 ) ;
スローテスト=関数( {} 、
{デフォルトのローカル} 、
印刷する( 「え」 ) ;
投げる() ;
印刷する( 「ふ」 ) ;
) ;
throwTest() ;
印刷する( 「ぐ」 ) ;
// インクルードファイルは次のとおりです
印刷する( 「B」 ) ;
投げて= 1 ;
投げる() ;
印刷する( 「C」 ) ;