在D中捕捉的替代方案?

时间:2011-01-28 06:56:27

标签: exception-handling d

我正在看Three Cool Things About D - The Case for the D Programing Language 它基本上说不要使用try / catch / finally(关于38mark.39:30表示你不想看看它生成的try / catch),它使用得更好范围(失败)(也是退出和成功)。

我的问题是当你想要检查异常并根据异常做一个动作时会发生什么,例如警告用户磁盘没有空间或将URL标记为404(.NET webclient / webrequest抛出此异常)或如果出现500错误代码,请稍后重试。我该怎么办?我必须使用try / catch还是有另一种方式?

2 个答案:

答案 0 :(得分:17)

scope语句允许您在退出声明它们的作用域时运行代码。scope(success)在正常退出作用域时运行。由于抛出异常,退出作用域时会运行scope(failure)。无论您如何退出范围,退出范围时都会运行scope(exit)。它们都不会让您访问任何抛出的异常。它们只允许您在退出当前作用域时根据退出该作用域的方式运行代码。

因此,基本上,如果您要捕获异常,执行某些操作,然后再次抛出异常而不关心异常实际是什么,可以使用scope(failure)代替catch,{可以使用{1}}代替scope(exit)。但是,如果您确实需要例外,那么您将不得不使用finally - try块来捕获它。 catch只是不允许您访问异常,因此如果您想要实际处理抛出的异常,则不能使用scope语句。但是,scope在您不关心异常实际情况时效果很好。

答案 1 :(得分:1)

scope不会取代catch。当您实际处理(或恢复)异常时,必须使用catch。如果要在堆栈展开期间进行清理,请使用scope或有时使用finally。这样,您将获得更清晰,可维护的代码。