C# 从任何类型的异常中检索唯一的错误代码

C# 从任何类型的异常中检索唯一的错误代码,c#,.net,exception,.net-core,C#,.net,Exception,.net Core,我的应用程序中有代码,它使用的系统库可以抛出加密异常 在我的情况下,当 ssl证书的密码格式不正确 ssl证书的密码为纯文本 但这不重要,因为我的问题相当笼统 因此,对于第一种情况,抛出的异常是 System.Security.Cryptography.Cryptography异常:填充无效,无法删除。 对于第二种情况,例外情况是 System.Security.Cryptography.Cryptography异常:输入数据不是完整的块。 因此,我要做的是将此错误记录到Windows事件日

我的应用程序中有代码,它使用的系统库可以抛出
加密异常

在我的情况下,当

  • ssl证书的密码格式不正确
  • ssl证书的密码为纯文本
但这不重要,因为我的问题相当笼统

因此,对于第一种情况,抛出的异常是

System.Security.Cryptography.Cryptography异常:填充无效,无法删除。

对于第二种情况,例外情况是

System.Security.Cryptography.Cryptography异常:输入数据不是完整的块。

因此,我要做的是将此错误记录到Windows事件日志中,并根据错误使用不同的事件ID

因此,例如,抛出的第一个错误应记录为事件id
1
,第二个错误记录为事件id
2

另外,我不想使用
Exception.Message
来登录事件日志,因为错误不会显示它是基于密码的。一、 作为开发人员,当然知道它来自哪里,但是当系统管理员检查日志时,他不知道这意味着什么。这可能意味着什么

但是,我查看了异常,除了消息/堆栈跟踪之外,这些异常之间没有区别

我看到有一个
HResult
属性来标识expetion,但是当我使用
e.HResult.ToString(“x”)
时,在这两种情况下都是
80131501
(输入数据不是完整的块,填充无效)

所以我不想使用字符串比较来查看要抛出的事件id和要使用的消息。除了消息字符串之外,还有其他消息可以识别抛出的确切消息吗

从其他语言中,我知道异常通常有一个
ErrorCode
属性,该属性对于异常和消息是唯一的


C#中是否有类似的东西,或者如何从同一个异常类中识别两个不同的异常消息?

任何类型都太广泛了。这真的取决于异常:),winapi,您的案例不同。啊,太酷了!是的,所以我需要类似于
SqlException
中的东西,但是对于
加密异常
,但似乎我运气不好,如果我能够使用代码,它依赖于异常,对吗?所以可能,对于每个没有数字的异常,我就是不能用这个,对吗?你知道我会怎么做吗?听起来我不得不求助于消息,只是在错误代码的含义的某个地方添加一个wiki页面,或者根据消息字符串使用错误代码,如果你不想使用文本,那你就倒霉了。
cryptographicsexception
中根本没有数据能够以更机器友好的方式区分原因。更糟糕的是,这些消息是本地化的,并且没有简单的方法来匹配消息的本地化版本,以保证跨框架工作。例如,“填充无效且无法删除。”是.NET Framework中的
Cryptography\u PKCS7\u InvalidPadding
,是.NET Core中的
Cryptography\u InvalidPadding
(资源位于不同的文件中)。好的,谢谢您的回答。至少我知道现在对一些人来说是可能的,但不是对所有人。然后,我将只使用异常的异常消息,并在readme.md或confluence/中提供一个指南,使它们更具描述性。或者,因为我知道它与密码有关,所以我可以说密码也有问题,并使用我自己的代码。非常感谢你。您想将此作为一个答案发布,以便我可以接受吗?对于像
加密术
这样基本上都是只报告“it failed”的黑盒操作的API,您最好的选择是确保调用代码能够检测并产生高级别错误,而不必依赖较低级别来告诉它们出了什么问题。换句话说,您知道发生
加密异常时失败的操作,所以记录(“错误或未加密的密码”)加上“知情人士”的内部消息。任何类型都太广泛了。这真的取决于异常:),winapi,您的案例不同。啊,太酷了!是的,所以我需要类似于
SqlException
中的东西,但是对于
加密异常
,但似乎我运气不好,如果我能够使用代码,它依赖于异常,对吗?所以可能,对于每个没有数字的异常,我就是不能用这个,对吗?你知道我会怎么做吗?听起来我不得不求助于消息,只是在错误代码的含义的某个地方添加一个wiki页面,或者根据消息字符串使用错误代码,如果你不想使用文本,那你就倒霉了。
cryptographicsexception
中根本没有数据能够以更机器友好的方式区分原因。更糟糕的是,这些消息是本地化的,并且没有简单的方法来匹配消息的本地化版本,以保证跨框架工作。例如,“填充无效且无法删除。”是.NET Framework中的
Cryptography\u PKCS7\u InvalidPadding
,是.NET Core中的
Cryptography\u InvalidPadding
(资源位于不同的文件中)。好的,谢谢您的回答。至少我知道现在对一些人来说是可能的,但不是对所有人。然后,我将只使用异常的异常消息,并在readme.md或confluence/中提供一个指南,使它们更具描述性。或者,因为我知道它与密码有关,所以我可以说密码也有问题,并使用我自己的代码。非常感谢你。你想把这个作为一个答案,让我可以接受吗?你的答案是