真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

.NET4中異常處理的新機(jī)制是什么

本篇內(nèi)容介紹了“.NET4中異常處理的新機(jī)制是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

十多年的巴楚網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整巴楚建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“巴楚網(wǎng)站設(shè)計(jì)”,“巴楚網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

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

try             {                  TestMethod();              }              catch (Exception e)              {                  Console.WriteLine("Catching exception: {0}", e);              }

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

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

Program.cs

using System;     using System.Runtime.InteropServices;       namespace ConsoleApplication1 {       class Program     {           [DllImport("Ref.dll")]           private extern static void TestMethod();           static void Main(string[] args)           {             try               {          TestMethod();               }               catch (Exception e)               {                   Console.WriteLine("Catching exception: {0}", e);               }           }     } }

Ref.cpp:

#include "stdafx.h"       extern "C" __declspec(dllexport) void TestMethod() {            int *p = NULL;                      // 會(huì)導(dǎo)致.NET拋出一個(gè)AccessViolation異常            *p = 10; }

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

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

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

App.config:

                           

這個(gè)設(shè)置告訴CLR 4.0,整個(gè).NET程序都要使用老的異常捕捉機(jī)制。

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

[HandleProcessCorruptedStateExceptions]     static void Main(string[] args) {       try     {           TestMethod();       }       catch (Exception e)       {           Console.WriteLine("Catching exception: {0}", e);       } }

“.NET4中異常處理的新機(jī)制是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


文章題目:.NET4中異常處理的新機(jī)制是什么
網(wǎng)站URL:http://weahome.cn/article/gccdip.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部