我想知道這段代碼是否CleanUp()會以呼叫10 次重試后的方式作業?或者throw new Exception()不會被最后一個 catch 塊捕獲?
public void Process()
{
try
{}
catch (MyException e)
{
int retries = GetRetries();
if(retries > 10)
{
_logger.LogError("Retried event already {retries} times. Giving up.", retries);
throw new Exception("Giving up!");
}
Process();
}
catch (Exception e)
{
CleanUp();
}
}
uj5u.com熱心網友回復:
不,它不是那樣作業的。對于任何給定的try/catch塊,只有源自 的例外try才能被相應的catch塊捕獲。catch塊內拋出的例外無法被catch同一級別的其他塊捕獲。
finally塊允許您在控制元件因任何原因離開try/時運行代碼。因此,如果您的末尾已經有一個,那么您只需將最終更改為并洗掉部分末尾的。catchtryCleanUpcatch(Exception e)finallyCleanUptry
但是,如果您只想CleanUp在控制通過例外離開try/時運行,那么您就沒有那么幸運了。IL 中有一個子句,它是, 但僅用于例外,但在 C# 中沒有公開。catch faultfinally
因此,如果您需要這樣做,通常最好引入一個額外的內容bool,表明您try無一例外地到達了塊的末尾,并使用它使您的CleanUp呼叫在finally.
或者您可以通過嵌套/塊來模擬try/ catch/ :faulttrycatch
try
{
try
{}
catch (MyException e)
{
int retries = GetRetries();
if(retries > 10)
{
_logger.LogError("Retried event already {retries} times. Giving up.", retries);
throw new Exception("Giving up!");
}
Process();
}
}
catch
{
//Act as fault
CleanUp();
throw;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/331403.html
