2

try-catchブロックから飛び出すためのキーワードを持つ言語はありますか?

たとえば、Ruby にはウォークアラウンドがあります。

lambda {
    begin
        p 0
        break
        p 1
    rescue
        p 2
    end
}.call
p 3

Javascriptでも可能です(私は信じています)。
しかし、(インデントを避けるために) 匿名関数を使用しない方法が必要breakですcontinue

C/C++/C# 言語でgoto.

別のアプローチを持つ言語は存在しますか?

4

3 に答える 3

1

キャッチした既知の例外をいつでもスローできますが、何もしません。C#で

try {
    if(true)
        throw new GetOutException();
}
catch(GetOutException e) {
}
catch(Exception e) {
    // Do something here    
}
于 2012-06-16T16:01:48.353 に答える
1

継続を使用すると、コード内の任意の部分からジャンプできます。たとえばcall-with-current-continuation、Schemeで。ウィキペディアのこの例は、基本的な概念を示しています。

(define (f return)
  (return 2)
  3)

(display (f (lambda (x) x))) ; displays 3

(display (call-with-current-continuation f)) ; displays 2

一般に、継続は、プロシージャの実行の任意のポイントから脱出するために使用できます(ブロックに限定されませんtry/catch)。それがどれほど深くネストされていても、その点では、Exceptionまたはよりも一般的な構造です。 goto、これらの構成は両方とも継続の観点から実装できるためです。

最初は、継続は把握しやすい概念ではありませんが、実践することで非常に役立つ場合があります。継続の多くの可能なアプリケーションについて詳しく説明しているこのペーパーを参照してください。

于 2012-06-16T16:04:29.293 に答える
0

gotoしたがって、基本的には、コードの特定の部分の実行をスキップするために同等のものを求めているように聞こえます。何かのようなもの:

foo();
if (!bar) {
    goto end;
}
baz();

end:
print "ended";

s の長所と短所については説明しgotoませんが、さまざまな理由から、多くの言語では使用できません。ただし、同じ効果を得るために、ほぼ常に以下のようにコードを定式化できます。

foo();
if (bar) {
    baz();
}

print "ended";

これは、実際に例外を使用している場合にも明らかに機能します。

try {
    foo();
    if (bar) {
        baz();
    }
} catch (Exception e) {
    help();
}

print "ended";

特定の状況下でコードの特定のブランチの実行をスキップするのと同じ効果があり、それを行う標準的な方法です。から抜け出すtry..catchか、同等のものを使用するgotoことで利点が得られる状況を想像することはできません。

于 2012-06-18T09:26:59.760 に答える