我想抓住在不同的步骤抛出的异常。请看下面的代码。假设每个函数Procedure1、Procedure2、.、Procedure6可能抛出各种异常(可能重叠!)。如果异常发生在步骤1-3,我想抛出新定义的异常ex1和步骤4-6 ex2。
public void TestFunc(){
try{
var res1 = Procedure1();
var res2 = Procedure2(res1);
var res3 = Procedure3(res2);
var res4 = Procedure4(res3);
var res5 = Procedure5(res4);
Procedure6(res5);
}
catch{
// if error/exception occurs in step 1-3 throw exception 1
}
catch{
// if error/exception occurs in step 4-6 throw exception 2
}
}我读过https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-catch,但并没有明白重点。
如果所有步骤都抛出不同的异常,那么我可以捕获不同的异常。但不同步骤的例外情况可能会重叠。因此,我无法从异常消息中真正分辨出这是哪一步。(是的,这可以通过添加关于异常消息的额外信息来克服,但我真的不想修改其他函数。)
我能想到的一种方法是将TestFunc分成两部分,但我真的不想这样做,因为它破坏了函数的完整性。
如果我们将这些步骤分成两个try,编辑器将显示消息res3 does not exist in the context。这是合理的,因为{}分离了上下文。
public void TestFunc(){
try{
var res1 = Procedure1();
var res2 = Procedure2(res1);
var res3 = Procedure3(res2);
}
catch{
// if error in step 1-3 throw exception 1
}
try{
var res4 = Procedure4(res3); // error, res3 cannot be found in the context
var res5 = Procedure5(res4);
Procedure6(res5);
}
catch{
// if error in step 4-6 throw exception 2
}
}发布于 2019-10-21 08:49:39
我建议嵌套结构
try {
var res1 = Procedure1();
var res2 = Procedure2(res1);
var res3 = Procedure3(res2);
try {
var res4 = Procedure4(res3);
var res5 = Procedure5(res4);
Procedure6(res5);
}
catch {
// Specific exceptions if error/exception occurs in step 4-6
}
}
catch {
// Exceptions within res1...res3
// Unspecific Exceptions within steps 4-6
}发布于 2019-10-21 08:48:40
只需在try之外声明变量
public void TestFunc(){
// declare all variables here
ResultType res1, res2, res3, res4, res5;
try{
res1 = Procedure1();
res2 = Procedure2(res1);
res3 = Procedure3(res2);
}
catch{
// if error in step 1-3 throw exception 1
}
try{
res4 = Procedure4(res3); // error, res3 cannot be found in the context
res5 = Procedure5(res4);
Procedure6(res5);
}
catch{
// if error in step 4-6 throw exception 2
}
}发布于 2019-10-21 08:50:21
当您开始使用这个级别的错误处理编写代码时,它必然会变得非常冗长,并且您的大部分代码最终都会处理错误案例。你应该接受这个事实。
这样做的一种方法是,正如你已经描述的那样:
Res1 res1;
try
{
res1 = Procedure1();
}
catch ....
Res2 res2;
try
{
res2 = Procedure2(res1);
}
catch ....或者,您可以在它们自己的助手方法中编写这些过程,这些方法处理它们的错误处理:
private Res1 HandleProcecure1()
{
try
{
return Procedure1();
}
catch ....
}
private Res2 HandleProcecure2(Res1 res1)
{
try
{
return Procedure2(res1);
}
catch ....
}
...
var res1 = HandleProcedure1();
var res2 = HandleProcedure2(res1);除非有方法需要完全相同的异常处理,我个人不喜欢尝试和分组它们。给每个自己的set catch语句,并编写一些助手方法,这意味着您避免在每个语句中编写相同的内容。
https://stackoverflow.com/questions/58482586
复制相似问题