成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳述.NET 4中異常處理的新機制

開發 后端
本文將為大家介紹.NET 4中異常處理的新機制,主要也是針對某些.NET里不能捕捉的一些異常,希望對大家有所幫助。

前幾天,有一個朋友問我為什么在.NET里不能捕捉(catch)到一些異常了,而且在調試器里也捕捉不到。研究了一下,是.NET 4.0里新的異常處理機制搗的鬼。

在.NET 4.0之后,CLR將會區別出一些異常(都是SEH異常),將這些異常標識為破壞性異常(Corrupted State Exception)。針對這些異常,CLR的catch塊不會捕捉這些異常,即使你用類似下面的代碼:

  1. try 
  2.             {  
  3.                 TestMethod();  
  4.             }  
  5.             catch (Exception e)  
  6.             {  
  7.                 Console.WriteLine("Catching exception: {0}", e);  
  8.             } 

也沒有辦法捕捉到這些異常。之所以要這樣設計,在MSDN的文章Handling Corrupted State Exceptions里已經提到了。即,有一些支持插件的程序,例如Visual Studio或者SQL Server,它們支持調用托管代碼編寫成的插件,但是它們自己本身有很多代碼是由非托管的C++寫成的。由于插件經常會調用到非托管的API,而很多時間,這些插件的代碼根本就不知道如何處理非托管的API拋出來的SEH異常。在4.0以前,因為SEH異常被轉換成了跟普通.NET異常相同的異常,這樣程序員只要用catch ( Exception e)的模式就可以捕捉到所有的異常。這樣處理的問題是,由于SEH異常通常都不是托管代碼拋出的,托管代碼根本就不知道SHE異常被扔出來的原因,簡單的catch ( Exception e)處理使得整個程序會處于一個非常不穩定的狀態,使得前面被忽略的問題在后面以更嚴重的方式出現 — 例如保存被破壞的數據。這樣,看起來使用catch ( Exception e)處理所有的異常的方法很簡單,但實際上讓程序員或者用戶在問題延后發生時,分析起來需要花費更多的精力。

因此在4.0以后,大部分SHE(我懷疑是所有)異常都被標識成破壞性異常,在.NET里,默認情況下CLR不會捕捉它們,而是任由操作系統來處理—即關閉程序,并打開一個錯誤對話框通知用戶。為了保證兼容性,在4.0以前編譯的程序,例如在2.0、3.0和3.5編譯的程序,依然采用的是老的策略—即.NET會同時捕捉.NET異常和SHE異常。而在4.0下面編譯的程序才會使用新的策略,這也是在文章的開頭,我的朋友所碰到的問題。你可以在.NET 4.0下面編譯下面的程序,體驗一下這個新變化:

Program.cs

  1. using System;     
  2. using System.Runtime.InteropServices;       
  3. namespace ConsoleApplication1 {       
  4. class Program     {           
  5. [DllImport("Ref.dll")]           
  6. private extern static void TestMethod();           static void Main(string[] args)          
  7.  {             try             
  8.   {          TestMethod();              
  9.  }               
  10. catch (Exception e)            
  11.    {                 
  12.   Console.WriteLine("Catching exception: {0}", e);         
  13.       }       
  14.     }     } }  

Ref.cpp:

  1. #include "stdafx.h"       
  2. extern "C" __declspec(dllexport) void TestMethod() {            
  3. int *p = NULL;                     
  4.  // 會導致.NET拋出一個AccessViolation異常           
  5.  *p = 10; } 

上面的代碼里,Program.cs使用P/Invoke技術調用了Ref.dll文件里的TestMethod,但是TestMethod嘗試給一個空指針賦值,導致一個AccessViolation異常。如果你在2.0下面編譯program.cs,并執行的話,這個AccessViolation異常會被catch(Exception e)捕捉到,而如果你在4.0下面編譯并執行的話,你會發現catch (Exception e)是不能捕捉到這個異常的。

然而并不是所有人都想要這個新的異常機制,如果你的程序是在4.0下面編譯并運行,而你又想在.NET程序里捕捉到SHE異常的話,有兩個方案可以嘗試:

1.   在托管程序的.config文件里,啟用legacyCorruptedStateExceptionsPolicy這個屬性,即簡化的.config文件類似下面的文件:

App.config:

  1. <?xml version="1.0"?> 
  2. <configuration> 
  3.  <startup> 
  4.    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
  5.  </startup> 
  6.     <runtime> 
  7.       <legacyCorruptedStateExceptionsPolicy enabled="true" /> 
  8.     </runtime> 
  9. </configuration> 

這個設置告訴CLR 4.0,整個.NET程序都要使用老的異常捕捉機制。

2.  在需要捕捉破壞性異常的函數外面加一個HandleProcessCorruptedStateExceptions屬性,這個屬性只控制一個函數,對托管程序的其他函數沒有影響,例如:

  1. [HandleProcessCorruptedStateExceptions]     
  2. static void Main(string[] args) {     
  3.   try     {          
  4.  TestMethod();     
  5.   }       
  6. catch (Exception e)    
  7.    {           
  8. Console.WriteLine("Catching exception: {0}", e);   
  9.     } } 

你也可以下載示例代碼自己試一下(需要VS 2010才能編譯):

http://files.cnblogs.com/killmyday/CSEsample.zip

原文標題:.NET 4.0里異常處理的新機制

鏈接:http://www.cnblogs.com/killmyday/archive/2010/09/05/1818533.html

【編輯推薦】

  1. 使用ASP.NET 4的自動啟動特性
  2. 詳解.NET 4.0并行計算支持歷史
  3. 詳讀.NET 4.0環境配置
  4. 詳解.NET 4.0中異常處理方面的新特性
  5. 三方面詮釋.NET 4.0的新特性
責任編輯:彭凡 來源: 博客園
相關推薦

2011-07-15 09:57:03

MongoDB緩存刷新

2020-10-13 08:36:30

React 架構機制

2021-12-08 06:53:28

Choreograph屏幕機制

2009-01-05 09:14:17

.NETcatch性能損失

2013-08-22 17:10:09

.Net異常處理

2020-09-21 14:35:20

VuenextTick前端

2010-03-10 11:55:30

Mocha BSM運維管理摩卡軟件

2021-04-21 07:53:13

Android屏幕刷新

2011-03-17 09:20:05

異常處理機制

2025-05-07 08:00:00

刷新令牌自動續簽FastAPI

2021-03-02 09:12:25

Java異常機制

2015-12-28 11:25:51

C++異常處理機制

2016-10-21 09:29:53

嵌入式Linux更新機制

2010-06-09 09:18:34

.NET 4并行編程

2011-04-06 10:27:46

Java異常處理

2024-03-04 10:00:35

數據庫處理機制

2010-04-14 09:20:26

.NET多線程

2010-01-05 09:26:13

.NET 4.0

2011-07-21 15:20:41

java異常處理機制

2018-08-10 04:40:56

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费一级做a爰片久久毛片潮喷 | 亚洲精品视频导航 | 日本aa毛片a级毛片免费观看 | 亚洲精品久久久久中文字幕二区 | 亚洲精品一区国语对白 | 久久久久网站 | 男人天堂色 | 国产精品夜间视频香蕉 | 亚洲图片一区二区三区 | 日韩在线免费 | 国产中文字幕在线观看 | 久久国产激情视频 | 免费久久久 | 精品九九 | 中文字幕免费观看 | 真人一级毛片 | 超碰91在线 | 国产高清视频一区二区 | 91麻豆精品国产91久久久更新资源速度超快 | 国产原创视频 | 亚洲精品国产第一综合99久久 | 中文字幕在线播放第一页 | 久久久久久久久久久久久九 | 亚洲午夜精品 | 精品国产精品三级精品av网址 | 亚洲精品一区在线观看 | 国产a视频 | 国产三级 | 欧美区日韩区 | 日韩欧美在线一区 | 久久精品欧美视频 | 男女羞羞视频在线 | 污污的网站在线观看 | 国产美女黄色片 | 国产精品成人一区二区三区夜夜夜 | 羞羞视频在线观看网站 | 黄色一级免费 | 国产成人一区在线 | 久草福利| 国产精品美女一区二区 | 日韩欧美操 |