10

最近我在网上看了一些编码。我发现有些人在块中使用Microsoft.VisualBasic.CompilerServices.ProjectData.ProjectData类。catch

 catch (Exception exception1)
        {
            //ProjectData.SetProjectError(exception1);
            Console.WriteLine(exception1.ToString());
            Console.WriteLine();
            Console.WriteLine(sSQL);
            //ProjectData.ClearProjectError();
        }

我在 msdn 上搜索了它,提到此 API 支持 .NET Framework 基础结构,并且不打算直接从您的代码中使用。

我很好奇人们使用它的原因是什么。你能给我解释一下吗?

4

3 回答 3

9

我的经验是,在从 VB6 转换而来的 c#/VB.NET 项目中可以找到这种类型的代码使用。在开发新的 c#/VB.NET 解决方案/项目时,不应使用这种做法。

注意:此技术可以安全地替换为您在其他 .NET 解决方案/项目中经常看到的正确异常处理。

于 2013-03-26T20:46:59.180 回答
4

此代码由将 VB 代码转换为 C# 的代码转换工具发出,或者由反编译最初使用 VB 创建的程序集产生。

我正在将一个 VB 项目移植到 Mono,发现 VB 编译器将这些调用注入ProjectData.SetProjectError(exception)ProjectData.ClearProjectError()任何 catch 块中,并试图找到一种方法来阻止编译器这样做,因为 Mono 没有实现该ProjectData模块。在做我的研究时发现了你的问题!

于 2015-11-17T19:48:56.260 回答
3

所以对于那些感兴趣的人来说,这是旧的遗留 vb6 的结果。当 vb6 开始时,有一个 err 对象仍然存在,但已移动到 vb 中的 projectdata 对象。如果像我这样的人还记得 vb6(这是恐龙在地球上漫游的时候),接下来有一个方便的小调用错误恢复。这是如果你不喜欢那些讨厌的小例外。大多数 vb6 程序大量使用它,瞧你没有例外,因为你忽略了任何一个。所以这里有解释。

catch (Exception exception1) // 捕获任何刚刚发生的异常

    {

        ProjectData.SetProjectError(exception1); // set the information 

//如果有人真的想检查,则在 err 对象中

        ProjectData.ClearProjectError(); //clear the err object
    }

正如您所看到的,这完全忽略了任何异常,并且以真正的 vb6 方式,您的代码只是在没有任何解释的情况下爆炸。不用说如果有人写这样的代码或以这种方式使用vb,我会找到你并想办法让你入狱。

于 2015-12-22T01:28:25.060 回答