在编程语言中是否存在try-loop这样的东西?`

时间:2013-10-25 02:23:04

标签: language-agnostic programming-languages

我注意到编程中非常常见的模式如下:

bool continue = true;
while (continue){
   try{
   do something
   break;
   catch(){
   do something else
   }
}

这里有两行真实代码的语法。

是否有一种(有点常见的)编程语言有一个try-loop(可能是其他名称),它会在抛出错误时重复X,并且可以在每次错误后执行Y

2 个答案:

答案 0 :(得分:1)

在tcl中你可以发明自己的语法(好吧,不是语法本身,只是一个控制结构,但从其他语言的角度来看,它看起来像是在发明语法):

proc foreach-catch {varname thelist script error_var catch_script} {
    upvar 1 $varname var  ;# link this var to the caller's stack

    foreach var $thelist {
        # uplevel executes code in the caller's stack:
        if {catch {uplevel 1 $script} error_var} {
            uplevel 1 $catch_script
        }
    }
}

现在你可以拥有一个引人注目的foreach循环:

# regular foreach looks like this:

foreach x $stuff {
    do-something-with $x
}

# our new foreach-catch looks very similar:

foreach-catch x $stuff {
    do-something-with $x
} error {
    handle-error-condition-for $x -with-error $error
}

当然,任何允许您传递代码块或函数的语言都可以实现这样的功能。这是一个javascript示例:

function foreach_catch (array,callback,error_callback) {
    for (var i=0;i<array.length;i++) {
        try {
            callback(array[i]);
        }
        catch (err) {
            error_callback(err,x);
        }
    }
}

这将允许您这样做:

foreach_catch(stuff,
    function(x){
        do_something_with(x);
    },
    function(error,x){
        handle(error,x);
    }
);

答案 1 :(得分:0)

在C#中,您可以将try方法模式包装在一个可以实现此目标的循环中。

这是一个带有队列的示例,该队列提供了预期会崩溃的TryDequeue方法,例如因为它可能需要读取不可靠的媒体(网络或文件系统)。

DequeueAndThrowExceptionOnErrors方法是可能引发您想要从循环中隔离的异常的部分。

int element;
while(myQueue.TryDequeue(out element))
{
    // process element
}

这是我们的Queue类中的TryDequeue方法。

bool TryDequeue(out int element)
{
    try
    {
        // dequeue logic
        element = DequeueAndThrowExceptionOnErrors();
        return true;
    }
    catch
    {
        // error handling
        element = 0;
        return false;
    }
}