-3

我有一个没有标准错误处理方法的大型解决方案。最近我发现很多方法都有 try/finally 阻塞。没有捕获块。我是如何发现所有这样的事情的?

4

1 回答 1

2

try并不一定意味着该块可以引发错误。对于懒惰的程序员来说,它有时是语法糖。

示例

假设您想要return一个值,然后修改该值。你可以这样写:

public int Foo () {
    int old = this.value;
    this.value = 5;
    return old;
}

但更方便的方法是:

public int Foo () {
    try {
        return this.value;
    } finally {
        this.value = 5;
    }
}

你可以说第二个实现更长,但总的来说,这是不正确的。此外,它还阻止了old显式存储值。第二种实现更具可读性并且不易出错,因为它说明了程序员的意图。

有人可能会争辩说,这使得try关键字比最初可能预期的更加模棱两可。一个更好的关键字可能更合适......


据我所知,没有简单的方法来检查try没有块的catch块。您可以希望 aRegex会找到大部分实例(例如使用,但说or块@"try\d*{[^}]*}\d*finally\d{[^}]*}中有一个额外的范围,那么将不会检测到这一点。最简单的可能是复制 C#/Vb.Net 的上下文无关语法然后在构建//块时进行适当的检查并打印以防它不包含块。tryfinallyRegextrycatchfinallycatch

于 2014-09-22T18:59:02.113 回答