Я не верю, что есть какой-либо способ сделать это, поскольку блоки catch находятся в разных областях. Невозможно повторно бросить, не выходя из блока try, и никак не «вызвать» последний блок catch, потому что он срабатывает только во время исключения.
Я бы предложил то же самое, что и roman m above, и просто сделать тот же звонок. В противном случае вам нужно сделать что-то действительно плохое. Как нижний сумасшедший код, который вы никогда не должны использовать, но я включил его, потому что он делает что-то вроде того, что вы хотите.
В целом, я думаю, что вы делаете контроль над нормальным потоком через исключения, которые не рекомендуется. Если вы пытаетесь отслеживать таймауты, вы, вероятно, должны просто обращаться с этим другим способом.
Обратите внимание, что вы можете сделать что-то вроде кода ниже с безумием оператора goto, но я включил его, чтобы никто не мог забыть, что это за плохая идея. =)
void Main()
{
Madness(new NotImplementedException("1")); //our 'special' case we handle
Madness(new NotImplementedException("2")); //our 'special' case we don't handle
Madness(new Exception("2")); //some other error
}
void Madness(Exception e){
Exception myGlobalError;
try
{
throw e;
}
catch (NotImplementedException ex)
{
if (ex.Message.Equals("1"))
{
Console.WriteLine("handle special error");
}
else
{
myGlobalError = ex;
Console.WriteLine("going to our crazy handler");
goto badidea;
}
}
catch (Exception ex)
{
myGlobalError = ex;
Console.WriteLine("going to our crazy handler");
goto badidea;
}
return;
badidea:
try{
throw myGlobalError;
}
catch (Exception ex)
{
Console.WriteLine("this is crazy!");
}
}
// Define other methods and classes here
почему не вы просто debugLogGeneralException (ex); вместо вашего комментария? –
@romanm: Как я уже сказал, это всего лишь псевдокод, и это не реальная функция в моем фактическом примере. – c00000fd
все, о чем я говорю, вы должны поставить логику «Исключительный обработчик» вместо своего комментария, а не «туда» –