好像是在csdn上看见的一个问题。
如下 现有A() B() C() 。。。。等很多个方法 但是他担心程序按
try
{
A();
B();//如这里抛异常 C()将不执行。
C();
//.....
}
catch (Exception e)
{
//
}
执行时如果遇到某个方法抛出异常,后面的方法不执行了。
他想怎么样呢?1.异常必须要捕获,但不一定要处理。2.某处抛出异常后,后面的方法继续执行。
如何解决:我看完了整个回帖都是用最笨的办法,其实我觉得还有其他办法可以解决。总结下。正好我想把不同声明的方法放在一个委托数组里,看看能不能读出来,分别执行数组里面的方法。
最开始的问题:
把能想到的方法列一遍
第一种方法:利用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 别错写成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;
}
}
}
第三种:用多线程 为每个方法开一个线程。
我测试了下 如下
try
{
Thread one = new Thread(A);
one.Start();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
上面这样不能捕获到方法内部的错误 只能捕获线程抛得一些异常。在每个方法里捕获异常?想想也对 既然A B C 这三个方法怀疑有异常抛出。为什么不在方法里面捕获异常呢?
-------------------------------------------------------------------------------------------------------------------------------------
由此想到的问题 如果用多播委托 则每个方法的声明格式都是一样的 (委托的协变和抗变 这里就不说了),那如果方法是
void A(){...}
void B(int size){...}
int C(){.....} 这时多播就有点鞭长莫及了。如何解决呢?
将不同委托类型的委托实例放在Delegate[]数组中后 在不知情的情况下 又怎么使用呢?