最近我在网上查看了一些编码。我发现有些人在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基础结构,并不打算直接在您的代码中使用。
我很好奇人们使用它的原因。你能解释一下吗?
答案 0 :(得分:8)
我的经验是,在从VB6转换的c#/ VB.NET项目中可以找到这种类型的代码。在开发新的c#/ VB.NET解决方案/项目时,不应该使用这种做法。
注意:此技术可以安全地替换为您将在其他.NET解决方案/项目中看到的适当异常处理。
答案 1 :(得分:4)
此代码由将VB代码转换为C#的代码转换工具发出,或者由反编译最初使用VB创建的程序集生成。
我将VB项目移植到Mono,发现VB编译器在任何catch块中注入了这些调用ProjectData.SetProjectError(exception)
和ProjectData.ClearProjectError()
,并试图找到一种方法来防止编译器这样做是因为Mono没有实现ProjectData
模块。在做我的研究时发现了你的问题!
答案 2 :(得分:2)
所以这是旧版传统vb6的结果。当vb6开始时,有一个错误的对象仍在,但已移动到vb中的projectdata对象。如果像我这样的人记得vb6(这是恐龙在地球上漫游的时候回来的话),接下来就会有一个方便的小错误。如果你不喜欢那些讨厌的小例外。大多数vb6程序大量使用它,瞧你没有例外,因为你忽略了任何。所以这里有解释。
catch(异常exception1)//捕获刚刚发生的任何异常
{
ProjectData.SetProjectError(exception1); // set the information
//在错误的对象中,如果有人想要检查
ProjectData.ClearProjectError(); //clear the err object
}
正如您所看到的,这完全忽略了任何异常,并且以真正的vb6方式,您的代码只会在没有任何解释的情况下爆炸。不用说,如果有人写这样的代码或以这种方式使用vb,我会找到你并找出让你被监禁的方法。