乱想想关于捕获异常后继续执行的实现。
好像是在csdn上看見的一個(gè)問題。
如下 現(xiàn)有A() B() C() 。。。。等很多個(gè)方法 但是他擔(dān)心程序按
??? try
??????????? {
??????????????? A();
??????????????? B();//如這里拋異常 C()將不執(zhí)行。
??????????????? C();
//.....
??????????? }
??????????? catch (Exception e)
??????????? {
???????????????
??????????????? //
??????????? }
執(zhí)行時(shí)如果遇到某個(gè)方法拋出異常,后面的方法不執(zhí)行了。
他想怎么樣呢?1.異常必須要捕獲,但不一定要處理。2.某處拋出異常后,后面的方法繼續(xù)執(zhí)行。
如何解決:我看完了整個(gè)回帖都是用最笨的辦法,其實(shí)我覺得還有其他辦法可以解決。總結(jié)下。正好我想把不同聲明的方法放在一個(gè)委托數(shù)組里,看看能不能讀出來,分別執(zhí)行數(shù)組里面的方法。
最開始的問題:
把能想到的方法列一遍
第一種方法:利用try{}finally{}
?try
???????? {????????
??????? ??try
??????????????? {
??????????????????? A();
??????????????? }
??????????????? finally
??????????????? {
??????????????????? try
??????????????????? {
??????????????????????? B();
??????????????????? }
??????????????????? finally
??????????????????? {
??????????????????????? try
??????????????????????? {
??????????????????????????? C();
??????????????????????? }
??????????????????????? finally
??????????????????????? {
??????????????????????? }
???????????????????????
??????????????????? }
??????????????? }
???????? }
???????? catch (Exception e)
???????? {
??????????????? MessageBox.Show(e.Message);?????
???????? }
第二種方法:利用多播委托
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace bfm
{
???
??? public partial class Test : Form
??? {
??????? delegate void dg();
??????? public Test()
??????? {
??????????? InitializeComponent();
??????????? Begin();
??????? }
??????? public void Begin()
??????? {
???????????
??????????? dg de = A;
??????????? de += B;
??????????? de += C;
??????????? //Delegate 別錯(cuò)寫成delegate
??????????? Delegate[] delegateArray = de.GetInvocationList();
??????????? foreach (dg d in delegateArray)
??????????? {
??????????????? try
??????????????? {
??????????????????? //d.Invoke();
??????????????????? d();
??????????????? }
??????????????? catch (Exception e)
??????????????? {
??????????????????? MessageBox.Show(d.Method.ToString());
??????????????? }
??????????? }
??????? }
??????? public static void A()
??????? {
??????????? int a = 0;
??????????? int b = 10 / a;
??????? }
??????? public static void B()
??????? {
??????????? int a = 0;
??????????? int b = 10 / a;
??????? }
??????? public static void C()
??????? {
??????????? int a = 0;
??????????? int b = 10 / a;
??????? }
??? }
}
第三種:用多線程 為每個(gè)方法開一個(gè)線程。
我測試了下 如下?
?try
??????????? {
??????????????? Thread one = new Thread(A);
??????????????? one.Start();
??????????? }
??????????? catch (Exception e)
??????????? {
??????????????? MessageBox.Show(e.Message);
??????????? }
??上面這樣不能捕獲到方法內(nèi)部的錯(cuò)誤? 只能捕獲線程拋得一些異常。在每個(gè)方法里捕獲異常?想想也對 既然A B C 這三個(gè)方法懷疑有異常拋出。為什么不在方法里面捕獲異常呢?
-------------------------------------------------------------------------------------------------------------------------------------
由此想到的問題 如果用多播委托 則每個(gè)方法的聲明格式都是一樣的 (委托的協(xié)變和抗變 這里就不說了),那如果方法是
void A(){...}?
void B(int size){...}
int?C(){.....} 這時(shí)多播就有點(diǎn)鞭長莫及了。如何解決呢?
將不同委托類型的委托實(shí)例放在Delegate[]數(shù)組中后 在不知情的情況下 又怎么使用呢?
轉(zhuǎn)載于:https://www.cnblogs.com/yueliang/archive/2010/04/19/1715714.html
總結(jié)
以上是生活随笔為你收集整理的乱想想关于捕获异常后继续执行的实现。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python3 OOP(四) 获取对象信
- 下一篇: 关于UDP协议