首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编程语言中有try-loop这样的东西吗?

编程语言中有try-loop这样的东西吗?
EN

Stack Overflow用户
提问于 2013-10-25 10:23:04
回答 2查看 73关注 0票数 1

我注意到编程中的一种非常常见的模式是这样的:

代码语言:javascript
复制
bool continue = true;
while (continue){
   try{
   do something
   break;
   catch(){
   do something else
   }
}

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

有没有一种(有些常见的)编程语言有一个try-循环(可能用了其他名字),它会在抛出错误时重复X,并且可以在每个错误之后执行Y

EN

回答 2

Stack Overflow用户

发布于 2013-10-25 11:15:22

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

代码语言:javascript
复制
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循环:

代码语言:javascript
复制
# 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示例:

代码语言: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);
        }
    }
}

这将允许您这样做:

代码语言:javascript
复制
foreach_catch(stuff,
    function(x){
        do_something_with(x);
    },
    function(error,x){
        handle(error,x);
    }
);
票数 1
EN

Stack Overflow用户

发布于 2013-10-25 10:38:58

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

下面是一个使用queue的示例,它提供了一个预计会崩溃的TryDequeue方法,例如,因为它可能需要在不可靠的介质(网络或文件系统)上读取数据。

DequeueAndThrowExceptionOnErrors方法是可能抛出异常的部分,您希望将该异常与循环隔离。

代码语言:javascript
复制
int element;
while(myQueue.TryDequeue(out element))
{
    // process element
}

下面是我们的Queue类中的TryDequeue方法。

代码语言:javascript
复制
bool TryDequeue(out int element)
{
    try
    {
        // dequeue logic
        element = DequeueAndThrowExceptionOnErrors();
        return true;
    }
    catch
    {
        // error handling
        element = 0;
        return false;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19580081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档