扯关于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: }

-2147483648=0x80000000

-2147024891=0x80070005
-2147024690=0x800700CE

posted @ 2009-01-27 21:12  new 维生素C.net()  阅读(329)  评论(0编辑  收藏  举报