扯关于Exception的蛋
并不是所有的Exception都能按.net那种思路搞定,有些只能造假:
1: internal enum ExceptionMessageKind
2: {
3: OutOfMemory = 3,
4: ThreadAbort = 1,
5: ThreadInterrupted = 2
6: }
Exception就是用一个叫HResult的int类型的东东来作为ErrorCode来折腾的, 这是来自于win32的设计, Marshal类中专门有个GetLastWin32ErrorCode类似的方法来获取这个int值.
HttpException的设计是比较有意思的,里面有个HttpCode属性,但是这也给外界的使用者制造了点小麻烦,如果anthorize验证失败怎么抛异常? 如果内部服务器出错,又怎么抛异常? 所以HttpException的HttpCode是分几种情况的:
1. 如果是HttpException,并且其中的HttpCode属性的值>0,那么就返回它
2. 如果不是HttpException,是UnauthorizedAccessException返回401 是PathTooLongException返回414
3. 如果有InnerException就重复1-3的步骤,如果没有就返回500
这里的HResult这个int值的计算方式为:
1: internal static int HResultFromLastError(int lastError)
2: {
3: if (lastError < 0)
4: {
5: return lastError;
6: }
7: return (((lastError & 0xffff) | 0x70000) | -2147483648);
8: }
-2147024891=0x80070005
-2147024690=0x800700CE