C#问题。任意类Class
具有方法Foo()
,这是一种可以抛出异常的方法。有没有办法向bar()
添加私有回调机制Class
,这样如果Foo()
抛出异常,bar()
执行将在之前触发 >投掷继续上升?如果发生这种情况,那么在发现异常之后呢?
- 编辑 -
由于一些最初的评论是"这让你感到困惑的是你在做什么"我将进一步解决这个问题。
我想要一个异常监听器的原因是因为我有一些关于类Class
的公开可读的布尔状态,我想在抛出异常时将其设置为true。由于Class
中可能存在多个抛出异常的函数,因此我不希望每次抛出异常时都将hasError设置为true。自动化,宝贝。
所以我们的界面和主要功能是:
public interface IObjectProvider
{
IEnumerable<object> Allobjects { get; }
}
public interface IContext
{
delegate bool ContextIsStillValid(object o);
delegate void Run(object o);
}
// main program
public static void Main() {
IContext context = initcontext(...);
IObjectProvider objectProvider = initobjectprovider(...);
// ...program executes for awhile...
foreach(var obj in objectProvider.AllObjects)
{
if(context.ContextIsStillValid(obj))
{
try
{
context.Run(obj);
}
catch(Exception e)
{
// log the error
}
}
}
}
在上面的代码段中,我们指定了一些IContext
,它们将会运行&#39;使用某些object
,当且仅当<{em} IContext
首次成功通过了“验证”时才会使用检查使用相同的object
。精细。现在,IContext
的实现的常见变体如下(接受我的话,它是):
public class Class : IContext {
private bool _hasError = false;
// so our validation check is implemented with an internal flag.
// how is it set?
public bool ContextIsStillValid = (o) => !_hasError;
public void Run =
(o) =>
{
string potentially_null_string = getstring(...);
if(potentially_null_string == null)
{
// our internal flag is set upon the need to throw an exception
this._hasError = true;
throw new Exception("string was null at wrong time");
}
Global.DoSomethingWith(potentially_null_string.Split(',');
};
}
在这里,我们演示了IContext
的常见实现,这样一旦Run
方法抛出一个Exception
,Run
方法就会无法访问由于IsContextStillValid
随后总是返回false。
现在假设在Run(object)
的实现中还有其他抛出异常的调用。问题是每次我们想要抛出一个新的异常时,我们必须将代码复制到_hasError = true; throw new Exception(...);
的效果。理想情况下,异常监听器会为我们解决这个问题,如果你们中的任何一个人知道如何实现它,我很好奇。
希望有所帮助。
答案 0 :(得分:0)
public class MyClass
{
public void Foo()
{
try
{
//Execute some code that might fail
}
catch
{
bar();
throw;
}
}
private void bar()
{
//do something before throwing
}
}