我注意到编程中一个非常常见的模式如下所示:
bool continue = true;
while (continue){
try{
do something
break;
catch(){
do something else
}
}
对于 2 行真实代码,这里有很多语法。
是否有一种(有些常见的)编程语言有一个尝试循环(可能是其他名称),它会X
在抛出错误时重复,并且可以Y
在每个错误之后执行?
我注意到编程中一个非常常见的模式如下所示:
bool continue = true;
while (continue){
try{
do something
break;
catch(){
do something else
}
}
对于 2 行真实代码,这里有很多语法。
是否有一种(有些常见的)编程语言有一个尝试循环(可能是其他名称),它会X
在抛出错误时重复,并且可以Y
在每个错误之后执行?
在 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);
}
);
在 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;
}
}