基本上,我想做的是在同一个 try block 中将一个特定的异常传递给一个更通用的异常。我已经尝试了以下但它不起作用:
static bool example(int count = 0)
{
try
{
work();
}
catch (TimeoutException e)
{
if (count < 3)
{
Console.WriteLine("Caught TimeoutException: {0}", e.Message);
return example(count + 1);
}
else
{
throw new Exception(e.Message);
}
}
catch (Exception e)
{
Console.WriteLine("Caught Exception: {0}", e.Message + " rethrown");
return false;
}
return true;
}
static void work()
{
throw new TimeoutException("test");
}
我希望 TimeoutException
在转到更通用的 Exception
之前只处理一定次数。这是因为 TimeoutException
根据具体情况提供有关异常的附加信息。我不想在 TimeoutException
的 else
子句下复制 Exception
的代码。我希望处理所有异常的原因是可能会抛出其他未知异常。该程序的性质要求它不会崩溃,因此我必须考虑任何其他异常并记录它们。我该如何实现?
最佳答案
如果你想这样处理,你需要将它嵌套为 2 次尝试:
static bool example(int count = 0)
{
try
{
try
{
work();
}
catch (TimeoutException e)
{
if (count < 3)
{
Console.WriteLine("Caught TimeoutException: {0}", e.Message);
return example(count + 1);
}
else
{
// Just throw, don't make a new exception
throw; // new Exception(e.Message);
}
}
}
catch (Exception e)
{
Console.WriteLine("Caught Exception: {0}", e.Message + " rethrown");
return false;
}
return true;
}
“内部 try/catch”只会捕获 TimeoutException
,因此任何其他异常将始终转到外部范围。当你重新抛出时,它也会自动被外部作用域捕获,这样就不需要杀死异常信息。 (如果您throw new Exception
,您将丢失堆栈跟踪数据和其他非常有值(value)的调试信息。)
关于c# - 我怎样才能传递异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13922165/