举个简单的例子.
主程序是一个解方程的题,下面有好几个函数,子函数,子子函数等等,还存在1级调用返回,2级调用返回,递归调用返回等.
这时,我想在最内部一个环节中,如果发现出现无解的情况(概率非常小,但是存在),不管现在是在被哪个函数几级调用,都直接返回主程序汇报.
如果一级一级的return,就要加很多的bool变量,增加无数的判断,有可能返回上级后还会继续N次无意义的循环等.
请教有什么好的方法么? 我原来想在出现无解的时候threw一个错误,在主程序中catch住.那么在所有的函数中的try/catch如何能一路绿灯直接放到主程序中呢?
主程序是一个解方程的题,下面有好几个函数,子函数,子子函数等等,还存在1级调用返回,2级调用返回,递归调用返回等.
这时,我想在最内部一个环节中,如果发现出现无解的情况(概率非常小,但是存在),不管现在是在被哪个函数几级调用,都直接返回主程序汇报.
如果一级一级的return,就要加很多的bool变量,增加无数的判断,有可能返回上级后还会继续N次无意义的循环等.
请教有什么好的方法么? 我原来想在出现无解的时候threw一个错误,在主程序中catch住.那么在所有的函数中的try/catch如何能一路绿灯直接放到主程序中呢?
子函数的try-catch不要使用通用的异常捕捉
这样如果子函数抓不到异常,自然会抛出到上一级
如果不是递归的话,直接return就可以阻止,你还可以在return前加上一个事件触发通知错误处理项。如果是递归,好像没啥好的处理方式,貌似可以用一个被人遗忘的东西处理,goto,呵呵,没在 c#里用过goto,不过记忆中c#是保留goto这种写法滴
1、定义一个Exception,比如:class MyException : Exception { }2、在子子函数里:if (xxx) throw new MyException();3、在子函数里:try
{
// ...
}
catch
{
throw;
}4、在最外层:try
{
}
catch (MyException ex)
{
// 原来是子子函数出错了
}
catch (Exception ge)
{
Console.WriteLine(ge.Message);
}
不知这样的效果是否可以
你可能需要更改你的程序结构,从瀑布模式改成总线模式简单想了一下,用这种结构
/*
调用者
|
+-----模块1
|
+-----模块2
|
+-----模块3
|
+-----模块4
*/
调用者可以发起调用,也可以取消模块用下面这样的接口 public interface ICancelableTask {
void BeginInvoke();
void Cancel();
}
....临时想的,仅供参考,有理解错误大家别打击我
象.NET、Java这些,更重视结构与代码安全,执行效率一般是放在第二位的
逐级返回是有必要的//加很多的bool变量,增加无数的判断
这些本来就应该有的吧
viena MM我怎么找不到你的MSN了…………
{
//your exception
} public class ExceptionObserver
{
public event ExceptionHandlerDelegate OnExceptionCatch;
public event ExceptionHandlerDelegate OnMyExceptionCatch; private static ExceptionObserver _instance; private ExceptionObserver()
{
//do nothing
} public static ExceptionObserver CreateInstance()
{
if (_instance == null)
{
_instance =new ExceptionObserver();
}
return _instance;
} public void ThrowException(Exception e)
{
if (e is MyException)
{
if (OnMyExceptionCatch != null)
{
OnMyExceptionCatch(e);
}
}
else
{
if (OnExceptionCatch != null)
{
OnExceptionCatch(e);
}
}
}
} public class MainClass
{
static void Main()
{
ExceptionObserver ob = ExceptionObserver.CreateInstance();
ob.OnMyExceptionCatch += new ExceptionHandlerDelegate(ob_OnMyExceptionCatch);
//do your work
WorkClass worker = new WorkClass();
worker.DoWork();
} static void ob_OnMyExceptionCatch(Exception e)
{
Console.WriteLine(e.Message);
}
} public class WorkClass
{
public void DoWork()
{
ExceptionObserver ob = ExceptionObserver.CreateInstance();
try
{
throw new MyException();
}
catch (MyException e)
{
ob.ThrowException(e);
}
catch(Exception e)
{
throw e;
}
}
}