我正在创建一个需要COM调用的.NET程序集。 VB6等。
大多数工作正常 - 我现在正在调整我的错误处理。
我想要做的是为我的例外创建特定的HRESULT
值 - 例如对我的例外情况使用0x88880001
等值。
我想使用一个通用的“前缀”(如0x8888
)然后将我的内部错误代码(从十进制1001运行)添加到该数字。
因此我的内部错误1001应该变为HRESULT = 0x888803E9
,依此类推。
我有自己的自定义.NET异常类,我知道我可以在基类HResult
类上设置受保护的ApplicationException
属性 - 但不知何故我无法获得我的“前缀”再加上我的错误代码......
使用System;
public class CustomException : ApplicationException
{
public CustomException(string message, int errorCode) : base(message)
{
base.HResult = (uint) 0x88880000 + errorCode;
}
}
无论我在这里尝试什么 - 我都无法获得int
值(base.HResult
,代表int
代表0x888803E9
存储到我的<ul>
<li ng-repeat="country in countries" type="country" class="slide">
<a ui-sref="state5"> {{country.name}}</a>
</li>
</ul>
基类......
我在这里缺少什么?
答案 0 :(得分:6)
C#编译器只是麻烦你阻止你绊倒溢出bug。合理的说,很多这种代码都无法在溢出检查中存活,而不是你在错误处理代码中想要的那种不幸事件:)注意upvoted答案中的代码如何与Project&gt;属性&gt;构建&gt;高级&gt; &#34;检查算术溢出/下溢&#34;选项勾选。一个没有得到充分利用的选项。
您必须使用 unchecked 关键字来禁止此运行时检查:
base.HResult = unchecked((int)(0x88880000U + errorCode));
或者您可以在编译时禁止它:
const int ErrorBase = unchecked((int)0x88880000);
base.HResult = ErrorBase + errorCode;
令人难以忍受的是:您生成的HRESULT不是有效的,它没有正确的设施代码。该代码提供了错误来自的提示。 Interop代码应使用0x80040000作为错误基础来选择FACILITY_ITF。不太确定你会对0x88880000感到悲伤,但是你生成的消息字符串是最重要的。不幸的是,客户端代码中往往会跳过ISupportErrorInfo,因此没有任何人真正看到它的保证。
答案 1 :(得分:2)
base.HResult = (int)((uint)0x88880000 + errorCode);
base.HResult是一个System.Int32。
然而,你的号码比Int32大,所以它会翻身。不确定您需要什么以及checked
是否有帮助。
然而,这似乎结束了:
void Main()
{
var ce = new CustomException("uh oh", 1001);
Console.WriteLine(ce.HResult);
// Convert integer as a hex in a string variable
string hexValue = ce.HResult.ToString("X");
// Convert the hex string back to the number
int decAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
Console.WriteLine(hexValue);
Console.WriteLine(decAgain);
}
public class CustomException : Exception
{
public CustomException(string message, int errorCode) : base(message)
{
base.HResult = (int)((uint)0x88880000 + errorCode);
}
}
最佳做法是从Exception类派生所有异常。