为什么人们使用ProjectData?

10

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

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

我在 MSDN 上查询到,该 API 支持 .NET Framework 基础结构,不建议直接从您的代码中使用。

我很好奇人们为什么会使用它。你能解释一下吗?


乍一看,我认为作者试图将此异常设置为内部VB错误。这个问题可能应该去问你所提到的代码的作者。 - Dhawalk
如果您使用反编译器解开用VB构建的程序集,您会发现VB编译器会在程序中默默注入许多这样的调用。 - Ashraf Sabry
3个回答

9

我的经验是这种代码用法在转换自VB6的C#/VB.NET项目中比较常见。但在开发新的C#/VB.NET解决方案/项目时,不应使用这种做法。

注意:这种技术可以通过其他.NET解决方案/项目中常见的正确异常处理方法来替代。


4
此代码可能是由将VB代码转换为C#的代码转换工具发出,或者是通过反编译最初使用VB创建的程序集生成的。
我正在将一个VB项目移植到Mono,发现VB编译器在任何catch块中注入这些调用ProjectData.SetProjectError(exception)ProjectData.ClearProjectError(),并试图找到一种方法防止编译器这样做,因为Mono不实现ProjectData模块。在研究过程中,我发现了你的问题!

3

对于那些感兴趣的人来说,这是旧版遗留VB6的结果。当VB6开始时,有一个Err对象,它仍然存在,但已经移到了VB的ProjectData对象中。如果有人像我一样记得VB6(这是恐龙还漫游地球的时候),就会发现有个非常方便的调用OnErrorResumeNext。如果不喜欢那些麻烦的异常,可以使用此功能。大多数VB6程序都会频繁使用它,这样你就不会有任何异常,因为你忽略了所有异常。下面是解释:

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

    {

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

//如果有人想要检查,可以在err对象中查看

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

正如你所看到的,这段代码完全忽略了任何异常,符合VB6的风格,代码会无任何说明而崩溃。毋庸置疑,如果有人编写此类代码或以此方式使用VB,我会找到你并想办法让你被监禁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接