1

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

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

对于 2 行真实代码,这里有很多语法。

是否有一种(有些常见的)编程语言有一个尝试循环(可能是其他名称),它会X在抛出错误时重复,并且可以Y在每个错误之后执行?

4

2 回答 2

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);
    }
);
于 2013-10-25T03:15:21.830 回答
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;
    }
}
于 2013-10-25T02:38:58.067 回答