当我有System.Exception和MyNamespace.Exception时,为什么捕获“Exception”不明确?

时间:2010-12-17 17:11:21

标签: c#

在我的C#代码中,我可以访问MyNamespace.ExceptionSystem.Exception。当我想要捕获其中一个例外时,理想情况下,我完全符合我想要捕获哪一个或使用别名来说清楚。但是,我担心只需键入catch(Exception)即可。我假设编译器会将其标记为不明确的名称,但事实并非如此。它总是假设我想要一个MyNamespace.Exception,如果我打算使用System.Exception,那么很明显会为许多例外留下漏洞。这不仅仅是Exception的问题,我也有例外MyNamespace.ArgumentException

所以我的问题是为什么编译器不会抱怨模糊的异常类型?另外,你会如何防止这个问题?

4 个答案:

答案 0 :(得分:9)

  

为什么编译器不会抱怨模糊的异常类型?

可能是因为你说的方式并不含糊。如果你说:

using MyNamespace;
using System;
class P 
{
    void M()
    {
        try { ... } catch(Exception) { ... }

那么它将是模棱两可的,因为不清楚哪个“使用”指令是相关指令;两者都可以发挥作用。

如果你说

using System;
namespace MyNamespace
{
  class P 
  {
    void M()
    {
      try { ... } catch(Exception) { ... }

然后它不含糊;当前命名空间中的内容优先于using指令导入的内容。

  

你会如何防止这个问题?

我不会首先考虑这种情况。将您的类型命名为与常见系统类型相同是令人困惑,危险并且违背良好的设计原则。

答案 1 :(得分:2)

当前命名空间中的类型优先于其他类型。

答案 2 :(得分:1)

这种情况发生的原因与C#编译器解析名称的方式有关。简而言之,它更喜欢当前名称空间中存在的名称与导入的名称空间中的名称。

防止此问题的第一步是不定义与System命名空间中的类型具有相同名称的类型。这样做只会导致潜在的模糊名称(对开发人员而言)。而是选择明确的名称,例如MyExceptionMyArgumentException

答案 3 :(得分:0)

我不会将我的例外命名为Exception。而是将其命名为其他内容(例如myException)。