我正在尝试处理异常并在数据库中保存该异常
Function1()
{
try
{
for(int i=0;i<dt.rows.count;i++)
{
Function2();
}
}
catch(exception ex)
{
saveInDB(ex.message.tostring(),id);
}
}
Function2()
{
try
{
function3()
}
catch(exception ex)
{
throw ex;
}
}
Function3()
{
try
{
function4()
}
catch(exception ex)
{
throw ex;
}
}
Function4()
{
try
{
code;
}
catch(exception ex)
{
throw ex;
}
}
假设我在方法4中遇到异常,那么它会将其抛给function3-&gt; Function2-&gt; function1,然后function1将在数据库中写入异常。
但在DB中写入异常之后我想继续循环。
那我该怎么办?
答案 0 :(得分:1)
但在DB中写入异常之后我想继续循环
这只能通过在for循环中放入(额外的)try / catch来实现。只有当下一轮循环是独立的并且您确定对您的系统没有任何伤害时,才应该这样做。
问问自己:在出现未知错误后,我是否还敢将业务数据写入数据库?
请注意,您的代码违反了一些最佳做法:
throw ex;
重置堆栈跟踪。将其替换为throw;
答案 1 :(得分:1)
您可以将try
- catch
放入for
循环体内:
Function1()
{
for(int i=0;i<dt.rows.count;i++)
{
try
{
Function2();
}
catch(Exception ex)
{
saveInDB(ex.message.tostring(),id);
}
}
}
但请记住,保存到DB等IO可能非常不可靠(而且速度慢)。这反过来可能会导致您的catch
中出现进一步的异常,从而导致您的循环被破坏。
因此,最好将所有抛出的异常存储在数据结构中,并立即将它们转储到DB中。这样,循环运行每个行。
Function1()
{
var errors = new LinkedList<Exception>();
for(int i=0;i<dt.rows.count;i++)
{
try
{
Function2();
}
catch(Exception ex)
{
errors.AddLast(ex);
}
}
if(errors.Count > 0)
{
// now you got all exception in errors and can dump
// them in one block
}
}
答案 2 :(得分:0)
只要任何try-catch块抛出异常,程序就无法继续。 如果您希望您的程序在异常处理后继续,我的建议是不使用:
throw ex;
答案 3 :(得分:0)
如果您需要在循环中的异常后继续循环,则需要添加try/catch
块within the loop
,如下所示;
try{
for(int i=0; i<10; i++){
try{
//do your work here
}
catch (Exception e){
//write to db here and then it will continue in the for loop
}
}
//rest of the code
}
catch (Exception ex){
//write to db
}