中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET4中異常處理的新機制是什么

發布時間:2022-03-31 14:24:56 來源:億速云 閱讀:117 作者:iii 欄目:編程語言

本篇內容介紹了“.NET4中異常處理的新機制是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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

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

也沒有辦法捕捉到這些異常。之所以要這樣設計,在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

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;                      // 會導致.NET拋出一個AccessViolation異常            *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:

<?xml version="1.0"?> <configuration>  <startup>    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>  </startup>     <runtime>       <legacyCorruptedStateExceptionsPolicy enabled="true" />     </runtime> </configuration>

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

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

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

“.NET4中異常處理的新機制是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

涟源市| 尉犁县| 江山市| 乡宁县| 永春县| 天长市| 西城区| 革吉县| 枝江市| 静海县| 凤山县| 右玉县| 南岸区| 蛟河市| 雷州市| 山西省| 宁远县| 榆林市| 南岸区| 西盟| 三门峡市| 奎屯市| 喀什市| 车致| 靖江市| 杨浦区| 黔西县| 舟曲县| 葫芦岛市| 老河口市| 九江县| 嘉义县| 青龙| 凤凰县| 浦城县| 辽中县| 泊头市| 宁晋县| 合川市| 阜南县| 洛川县|