IL異常處理

来源:http://www.cnblogs.com/lflyq/archive/2017/01/04/6249056.html
-Advertisement-
Play Games

異常處理在程式中也算是比較重要的一部分了,IL異常處理在C#裡面實現會用到一些新的方法 1.BeginExceptionBlock:異常塊代碼開始,相當於try,但是感覺又不太像 2.EndExceptionBlock:異常塊代碼結束,BeginExceptionBlock相當於try,EndExc ...


   異常處理在程式中也算是比較重要的一部分了,IL異常處理在C#裡面實現會用到一些新的方法

   1.BeginExceptionBlock:異常塊代碼開始,相當於try,但是感覺又不太像

   2.EndExceptionBlock:異常塊代碼結束,BeginExceptionBlock相當於try,EndExceptionBlock卻不是try結束。而是整個異常塊處理的結束。

   3.BeginCatchBlock:catch塊代碼

   4.BeginFinallyBlock:finally塊代碼

   5.ThrowException:拋出異常

  下麵我們就通過代碼來實現一下。

一、異常信息捕捉

首先我們做一個簡單的異常捕捉,然後輸出對應的異常信息,首先給出C#代碼:

            int translationInt = 0;
            try
            {
                translationInt = Convert.ToInt32(translationStr);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return translationInt;
View Code

實現代碼也比較簡單

            string name = "IL4.Dynamic";
            string fileName = string.Format("{0}.dll", name);

            //構建程式集
            AssemblyName assemblyName = new AssemblyName(name);
            //應用程式集域
            AppDomain domain = AppDomain.CurrentDomain;
            //實例化一個AssemblyBuilder對象來實現動態程式集的構建
            AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);

            //定義模塊(不加filename為瞬態模塊,不持久)
            ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(name, fileName);

            //定義類型
            TypeBuilder typeBuilder = moduleBuilder.DefineType(name, TypeAttributes.Public);

            MethodBuilder methodbuilder = typeBuilder.DefineMethod("ExceptionTest", MethodAttributes.Public, typeof(Int32), new Type[] { typeof(string) });
            ILGenerator IL = methodbuilder.GetILGenerator();
            LocalBuilder translationInt = IL.DeclareLocal(typeof(Int32));

            Type translationException = typeof(Exception);
            ConstructorInfo constructorInfo = translationException.GetConstructor(new Type[] { typeof(string) });
            MethodInfo exToString = translationException.GetMethod("ToString");


            IL.Emit(OpCodes.Ldc_I4_0);
            IL.Emit(OpCodes.Stloc_0);

            Label tryLabel = IL.BeginExceptionBlock();
            IL.Emit(OpCodes.Ldarg_1);
            IL.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToInt32", new Type[] { typeof(string) }));
            IL.Emit(OpCodes.Stloc_0);



            IL.BeginCatchBlock(typeof(Exception));
            IL.EmitCall(OpCodes.Callvirt, exToString, null);
            IL.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
            IL.EndExceptionBlock();

            IL.Emit(OpCodes.Ldloc_0);
            IL.Emit(OpCodes.Ret);
View Code

二、拋出異常

程式中有時候,不僅要捕捉異常信息,有時候也是需要拋出對應的異常信息,throw new Exception("translation Exception");這時候就需要用到ThrowException,代碼如下:

            IL.Emit(OpCodes.Ldstr, "translation Exception");
            IL.Emit(OpCodes.Newobj, constructorInfo);
            IL.ThrowException(typeof(newException));
            IL.Emit(OpCodes.Ldstr, "20");
            IL.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToInt32", new Type[] { typeof(string) }));
            IL.Emit(OpCodes.Stloc_0);
            IL.EmitCall(OpCodes.Callvirt, exToString, null);
            IL.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
View Code

1.IL.Emit(OpCodes.Newobj, constructorInfo):相當於是一個 new Exception("translation Exception");

2.不過在這一步有一個疑點, IL.ThrowException(typeof(newException));是不會把異常信息"translation Exception"拋出,而在對應的操作IL.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));卻能輸出這部分的異常信息。可以看下反編譯後的代碼

三、finally處理

finally實現也是比較簡單的,直接上代碼把

            IL.BeginFinallyBlock();
            IL.Emit(OpCodes.Ldstr, "10");
            IL.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToInt32", new Type[] { typeof(string) }));
            IL.Emit(OpCodes.Stloc_0);
            IL.EmitWriteLine("Finally");
            IL.EndExceptionBlock();
View Code

 

異常處理這塊msdn寫得也比較清楚,我也不多說了,示例代碼ExceptionDemo


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.安裝Oracle Oracle軟體是免費的,可以去官網下載相應的安裝包。但是如果用於商業用途需要購買License。官網上針對各種平臺,32位和64位都有,如果在Windows一般會下載到兩個文件。以Oracle 11g為例,有兩個zip壓縮文件,註意安裝前將兩個壓縮文件的內容解壓後合併。安裝提... ...
  • 第七節 Linux系統目錄結構介紹 標簽(空格分隔):Linux實戰教學筆記 第1章 前言 windows目錄結構 C:\windows D:\Program Files E:\你懂的\精品 F:\你懂的\動態圖 linux 目錄結構 一切從根開始 ===== ![屏幕快照 2017 01 02 下 ...
  • Ubuntu預設的是root用戶不能登錄圖形界面的,只能以其他用戶登錄圖形界面。這樣就很麻煩,因為許可權的問題,不能隨意複製刪除文件,用gedit編輯文件時經常不能保存,只能用vim去編輯。 解決的辦法是,編輯/etc/lightdm/lightdm.conf文件(可以先備份一下),把該文件編輯成這樣 ...
  • 查看網路狀態 ifconfig 修改網路參數 實驗環境centos6.5,其他系統自行百度 ls /etc/sysconfig/network-scripts 顯示所有文件, vi /etc/sysconfig/network-scripts/ifcfg-eth0 vi編輯網路參數 ONBOOT=y ...
  • 安裝網卡驅動程式: 需要檢查是否安裝kernel依賴包: rpm –q kernel-devel #檢查kernel依賴包是否安裝 yum –y install kernel-devel 檢查gcc和make是否安裝: rpm –q gcc make 下載驅動源碼包: 解壓源碼包: 安裝: 由於已經... ...
  • 作者:彭東林 郵箱:[email protected] QQ:405728433 開發板 TQ2440 + 64MB 內存 + 256MB Nand 軟體 Linux: Linux-4.9 (https://github.com/pengdonglin137/linux-4.9 ) u-b ...
  • 用U盤安裝Kali Linux的過程中,出現cd-rom無法掛載的現象,百度坑比啊,醉了。 下麵親測成功 ...... ...
  • 位運算符: 與:&二進位位均為1時,結果為1,否則0。二元運算,按位比較。 或:|二進位位均為0時,結果為0,否則1。二元運算,按位比較。 異或:^二進位位相同時,結果為0,否則1。二元運算,按位比較。 反:~二進位0時,結果為1,否則0。一元運算,按位比較。 左... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...