多次捕获异常-C#
具体i处理器多次捕获异常-C#,c#,exception,exception-handling,C#,Exception,Exception Handling,具体i处理器处理器。过程方法实现: private void ProcessData(IProcessor processor) { Data data = new Data(); try { processor.Process(data); } catch( Exception e ) { CustomCode(e); } } 我想对出现在ProcessData()方法或其“try”块中的所有异
处理器。过程方法实现:
private void ProcessData(IProcessor processor)
{
Data data = new Data();
try
{
processor.Process(data);
}
catch( Exception e )
{
CustomCode(e);
}
}
我想对出现在ProcessData()
方法或其“try”块中的所有异常运行CustomCode()
方法
(调用堆栈中从ProcessData()
到抛出异常的堆栈末尾的所有代码都应由多个异常处理程序处理-在本例中,应同时运行DoSomething()
和CustomCode()
)。
我怎样才能做到这一点?我知道我可以在“DoSomething();
”之后加上“throw;”,但这意味着处理器的每个实现中的每个程序员都应该始终记住写“throw;”
在catch(…)中,以便可以运行CustomCode(e)
。能做得更好吗
public void Process(Data data)
{
try
{
Thing a = null;
a.MakeSomething();
}
catch( NullPointerException e )
{
DoSomething();
}
}
}我同意@Seabizkit的评论,您可能不想在过程中实现try-catch,或者至少抛出
在进程
的catch块末尾出现异常以隐藏它是一种不好的做法
否则,解决方案可能是在ProcessData()
中设置一个finally
块,检查数据是否已处理(例如,设置了一个特殊标志),如果未处理,则意味着出现了问题,必须执行CustomCode()。比如:
public void Process(Data data)
{
try
{
Thing a = null;
a.MakeSomething();
}
catch( NullPointerException e )
{
CustomCode();
DoSomething();
}
catch(Exception ex)
{
CustomCode();
}
如果希望customerCode始终发生,而不考虑异常,则存在设计缺陷。为什么不从process()中删除try catch并让processdata()处理它呢。如果异常是由它自己处理的,那么您需要选择哪个应该处理什么。您不应该捕获NullReferenceException
(NPE是java,或者您有自己的异常类),而应该避免它。因此,根本不需要关心这个异常。在其中一个示例中,我将事务提交到数据库。如果提交此事务后出现异常,我希望回滚此事务。每个IPProcessor实现都应该有另一个异常处理代码,这取决于进程(数据)正在执行的操作。您可以使用委托。如果我理解正确,您希望在异常发生时调用CustomCode和DoSomething。我希望在ProcessData方法级别上实现异常处理,因为我有许多处理器类的实现。我将修改有问题的代码,以免混淆您。我同意使用finally块的解决方案是正确的:)
private void ProcessData()
{
Data data = new Data();
try
{
Processor processor = new Processor();
processor.Process(data);
}
catch( Exception e )
{
CustomCode(e);
}
finally {
if (!data.IsProcessed) CustomCode();
}
}