Хочу отловить исключение на разных шагах. Посмотрите на код ниже. Допустим, каждая функция 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://docs.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
}
}