簡體   English   中英

當我有System.Exception和MyNamespace.Exception時,為什么捕獲“Exception”不明確?

[英]Why is catching “Exception” not ambiguous when I have System.Exception and MyNamespace.Exception?

在我的C#代碼中,我可以訪問MyNamespace.Exception以及System.Exception 當我想要捕獲其中一個例外時,理想情況下,我完全符合我想要捕獲哪一個或使用別名來說清楚。 但是,我擔心只需鍵入catch(Exception) 我假設編譯器會將其標記為不明確的名稱,但事實並非如此。 它總是假設我想要一個MyNamespace.Exception ,如果我打算使用System.Exception ,那么很明顯會為許多異常留下漏洞而錯過捕獲。 這不僅僅是Exception的問題,我還有MyNamespace.ArgumentException等異常。

所以我的問題是為什么編譯器不會抱怨模糊的異常類型? 另外,你會如何防止這個問題?

為什么編譯器不會抱怨模糊的異常類型?

可能是因為你說的方式並不含糊。 如果你說:

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

那么它是模棱兩可的,因為不清楚哪個“使用”指令是相關指令; 兩者都可以工作。

如果你說

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

然后它不含糊; 當前命名空間中的內容優先於using指令導入的內容。

你會如何防止這個問題?

我不會首先考慮這種情況。 將您的類型命名為與常見系統類型相同是令人困惑,危險並且違背良好的設計原則。

當前命名空間中的類型優先於其他類型。

這種情況發生的原因與C#編譯器解析名稱的方式有關。 簡而言之,它更喜歡當前名稱空間中存在的名稱與導入的名稱空間中的名稱。

防止此問題的第一步是不定義與System命名空間中的類型具有相同名稱的類型。 這樣做只會導致潛在的模糊名稱(對開發人員而言)。 而是選擇明確的名稱,如MyExceptionMyArgumentException

我不會將我的異常命名為Exception 而是將其命名為其他東西(如myException )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM