是否有適合使用try-finally
塊而沒有catch
塊的情況?使用沒有'catch'塊的'try-finally'塊
回答
您可以使用它來確保在try
內容或異常之後發生某些操作,但是當您不希望使用該異常時。
只是要清楚,這不會隱藏異常。在異常傳播到調用堆棧之前,將運行finally
塊。
當您使用using
關鍵字時,您也會無意中使用它,因爲它編譯爲try-finally
(不是確切的轉換,而是因爲參數的緣故,它足夠接近)。在finally
運行
try
{
TrySomeCodeThatMightException();
}
finally
{
CleanupEvenOnFailure();
}
代碼是不能保證運行,但它不能保證是相當邊緣的情況下 - 我甚至不記得它。我記得的只是,如果你是那樣的話,那麼運行finally
不是最大的問題:-)所以基本上不會出汗。
來自Tobias的更新:finally
如果進程被終止將不會運行。從稻田
更新:Conditions when finally does not execute in a .net try..finally block
,最普遍的例子,你可能會看到即使代碼失敗,則配置數據庫連接或外部資源:
using (var conn = new SqlConnection("")) // Ignore the fact we likely use ORM ;-)
{
// Do stuff.
}
編譯成東西像:
SqlConnection conn;
try
{
conn = new SqlConnection("");
// Do stuff.
}
finally
{
if (conn != null)
conn.Dispose();
}
+1。 – 2012-02-15 10:16:58
有沒有很好的理由來做到這一點?隱藏異常不是很糟糕的做法!? – AnthonyBlake 2012-02-15 10:21:13
@AnthonyBlake異常不隱藏。如果發生異常,它將運行finally,然後將該異常傳播回調用堆棧。 – 2012-02-15 10:22:02
你需要一個finally塊,當不管哪個(如果有)異常被捕獲,或者即使沒有被捕獲,你仍然想在塊退出前執行一些代碼。例如,你可能想關閉一個打開的文件。
請參見try-finally
的try /最後:當你不希望處理任何異常,但要確保一些行動(S)發生異常是否是由稱爲碼拋出。
using
相當於try-finally
。當您想在finally
內部進行一些清理時,您只會使用try-finally
,並且不在意這個例外情況。
的最好的辦法將
try
{
using(resource)
{
//Do something here
}
}catch(Exception)
{
//Handle Error
}
這樣做甚至清理由using
叫失敗,您的代碼不會失敗。
有些情況下,finally
不會被執行。
- 如果有任何
StackOverflowException
或ExecutingEngineException
。 - 進程從外部源中被終止。
希望這回答你的疑問。
如果您有,例如您在try塊中創建並使用的非託管資源,則可以使用finally塊來確保釋放該資源。儘管try塊中會發生什麼(例外),finally塊將始終執行。
E.g.鎖(x)的說法是真的:
System.Threading.Monitor.Enter(x);
try { ... }
finally
{
System.Threading.Monitor.Exit(x);
}
finally塊總是會被調用,以確保排它鎖釋放。
這取決於你的應用程序的架構和您正在執行的塊操作。
我對C#一無所知,但似乎任何事情都可以用try-finally來做,你可以用using statement更優雅地做。 C++甚至沒有最終的a result of its RAII。
很好的解釋使用代碼:
void MyMethod1()
{
try
{
MyMethod2();
MyMethod3();
}
catch(Exception e)
{
//do something with the exception
}
}
void MyMethod2()
{
try
{
//perform actions that need cleaning up
}
finally
{
//clean up
}
}
void MyMethod3()
{
//do something
}
如果任MyMethod2或MyMethod3拋出異常,它將被MyMethod1捕獲。但是,MyMethod2中的代碼需要運行清理代碼,例如在異常傳遞給MyMethod1之前關閉數據庫連接。
這個'清理'的例子可能是saveLogFile(),我經常想把它放在程序的最後,不管是什麼。 – Vincent 2017-10-29 19:51:20
下面是我一直(呃..)使用用例:
int? x; //note the nullable type here!
try
{
x = int.Parse(someString);
}
catch { } //don't care, let it just be null
這是一個情況下,你可能想使用try最後:當你通常會使用一個使用聲明,但不能因爲您正在通過反射調用方法。
這將無法正常工作
using (objMsg = Activator.CreateInstance(TypeAssist.GetTypeFromTypeName("omApp.MessagingBO")))
{
}
改用
object objMsg = null;
try
{
objMsg
= Activator.CreateInstance(TypeAssist.GetTypeFromTypeName("myAssembly.objBO"));
strResponse = (string)objMsg.GetType().InvokeMember("MyMethod", BindingFlags.Public
| BindingFlags.Instance | BindingFlags.InvokeMethod, null, objMsg,
new object[] { vxmlRequest.OuterXml });
}
finally
{
if (objMsg!=null)
((IDisposable)objMsg).Dispose();
}
1.我們可以使用try塊沒有趕上,但是我們應該使用catch /終於, 它們中的任何一個。 2.我們不能只使用try塊。
- 1. 的UnknownHostException沒有在catch塊公認
- 2. 如何查找沒有catch塊的try塊?
- 3. 異常沒有在try catch塊釣到
- 4. Catch塊沒有發現錯誤
- 5. Laravel沒有運行try catch塊
- 6. Try ... catch塊沒有定義變量
- 7. 沒有try/catch塊關閉InputStream?
- 8. PHP PDO嘗試catch塊沒有捕獲
- 9. Catch塊是沒有得到執行
- 10. 有什麼更好的使用,__try/__ except塊或try/catch塊?
- 11. 是否可以在catch塊中使用Try catch塊?
- 12. 使用InputMismatchException try/catch塊
- 13. 訪問沒有使用try-catch塊未定義的對象
- 14. 的try/catch塊
- 15. try catch塊
- 16. EXEC ... catch塊
- 17. try catch塊
- 18. try-catch塊
- 19. 在catch塊
- 20. try catch塊宏
- 21. 在try catch塊
- 22. 的Android try catch塊
- 23. catch塊的選擇
- 24. 上的錯誤catch塊沒叫
- 25. Axios.Delete()沒有執行那麼既沒有catch塊
- 26. 使用try-catch塊的問題
- 27. Java的catch塊使用靜態綁定?
- 28. catch塊中的異常會被後面的catch塊捕獲嗎?
- 29. 沒有模塊使用pyOpenGL
- 30. 有沒有一種方法可以使用先前在try塊中分配的catch塊中的變量?
在MSDN上,請參閱[try-finally(C#Reference)](https://msdn.microsoft.com/en-us/library/zwc8s4fz%28v=vs.140%29.aspx)。注意這篇文章引用了'try'和'finally'作爲「** try-finally ** *語句*」的組合使用。代碼示例中的代碼爲 – DavidRR 2016-03-24 13:00:19