2012-01-01 22 views
4

當我遇到:如何在分享相同類型時區分兩個.NET異常?

View Certificate: .\SecurityTool.exe 

System.Security.Cryptography.CryptographicException: Cannot find the requested object. 

    at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) 
    at System.Security.Cryptography.X509Certificates.X509Utils._QueryCertFileType(String fileName) 
    at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyS 
torageFlags) 
    at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName) 
    at [email protected](String file) in C:\CORSIS\Software\PortFusion\0.9.3\PortFusionSource\PortFusion\SecurityTool\P 
rogram.fs:line 170 

    > Private Key Password 
    = "" 
    = PS C:\CORSIS\Software\PortFusion\0.9.3\PortFusionSource\PortFusion\SecurityTool\bin\Debug> .\SecurityTool certificates view .\go.pfx 
CORSIS PortFusion : Distributed Reverse Proxy Security Tool 0.9.8.0 



    View Certificate: .\go.pfx 

System.Security.Cryptography.CryptographicException: The specified network password is not correct. 

    at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) 
    at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySe 
t, SafeCertContextHandle& pCertCtx) 
    at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyS 
torageFlags) 
    at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName) 
    at [email protected](String file) in C:\CORSIS\Software\PortFusion\0.9.3\PortFusionSource\PortFusion\SecurityTool\P 
rogram.fs:line 170 

    > Private Key Password 
    = "" 
    = PS C:\CORSIS\Software\PortFusion\0.9.3\PortFusionSource\PortFusion\SecurityTool\bin\Debug> 

我怎麼能告訴System.Security.Cryptography.CryptographicException分開的兩個實例?

注:異常文本得到本地化的,所以我不能匹配其作爲描述將是對德國,中國機械等

+0

對於不同的類型,「消息」會有所不同 - 您將不得不使用本地化版本的測試:( – Oded 2012-01-01 18:45:35

+1

)您也可以比較'.StackTrace'並檢查例如_LoadCertFromFile – 2012-01-01 18:53:16

+0

另請參見http:/ /msdn.microsoft.com/en-us/library/system.security.cryptography.cryptographicexception.aspx,也許你可以區分錯誤代碼或內部異常。 – 2012-01-01 18:56:32

回答

2

我沒有測試,但Exception.HResult屬性看起來很有希望:MSDN

+0

HResult受保護,系統類拋出這些異常。我可以做反射,看看他們是否在我的情況下有所不同 – 2012-01-01 18:58:13

+3

請參閱http://stackoverflow.com/questions/991537/how-do- i-determine-the-hresult-for-a-system-io-ioexception,它使用'Marshal.GetHRForException' – 2012-01-01 19:02:08

+1

'Marshal'類有趣的方法 - 儘管這有副作用可能是不可取的(爲調用線程設置COM IErrorInfo數據)。 – bobbymcr 2012-01-01 19:06:19

0

他們Message性能會有所不同不同。

+1

他們沒有本地化?我應該檢查所有語言的世界? – 2012-01-01 18:55:02

3

你是正確的,避免使用消息字符串編程分化異常。您最好的選擇,以區分使用相同類型的例外情況如下:

  • The Data dictionary;這並不是經常使用,但是您可以檢查是否有任何類型的數據值不同。
  • InnerException類型(如果有的話)。

HResult值是有用的,但不可訪問(這是一個protected屬性 - 你需要思考讀它)。對於相同的異常類型,它也傾向於相同的值。

我需要指出的是,如果兩個異常具有相同的運行時類型,通常需要以相同的方式處理它們。評估你是否需要以不同的方式處理它們。