Try-Catch和“继续” – 这可能吗?
我的代码中有一个部分,我在网络上查询所有SQL Server数据库。 我首先尝试使用SQL登录来访问SQL Server实例,但如果失败,那么我想尝试使用我的Windows凭据进行连接。 之后,如果我仍然无法连接,那么我希望代码失败,然后通知用户。
所以我想我要问的是如何从Try-Catch块内部循环回到Try-Catch块上方的行:
String conxString = @"Data Source=SQLInstance1;User ID=FOO;Password=BAR;"; bool secondTime = false; using (SqlConnection sqlConx = new SqlConnection(conxString)) { Try{ sqlConx.Open(); DataTable tblDatabases = sqlConx.GetSchema("Databases"); sqlConx.Close(); secondTime = false; Console.WriteLine("SQL Server found!"); } Catch(System.Data.SqlClient.SqlException e){ if (!secondTime){ secondTime = true; conxString = @"Data Source=SQLInstance1; Integrated Security=True;"; //Loop back to the using statement to try again with Windows Creds { else{ Console.WriteLine("SQL Server not found or credentials refused"); } //Report Failure to connect to user } finally{ //Reset Variable secondTime = false; } }
我可能会走这条路:
String conxString = @"Data Source=Instance1;User ID=FOO;Password=BAR;"; //in your main function if(!TryConnect(conxString)) { Console.WriteLine("SQL Creditials failed. Trying with windows credentials..."); conxString = "new conn string"; TryConnect(conxString); } .............. //new function outside of your main function private bool TryConnect(string connString) { using (SqlConnection sqlConx = new SqlConnection(conxString)) { Try{ sqlConx.Open(); DataTable tblDatabases = sqlConx.GetSchema("Databases"); sqlConx.Close(); } Catch(System.Data.SqlClient.SqlException e){ return false; } return true; } }
成功后,您可以使用for
循环和break
结合使用:
for (int attempt = 1; attempt <= 2; attempt++) { try { /* perform attempt */ var success = TryToConnect(); if (success) break; } catch (Exception e) { /* report error */ } }
您还可以记录您是否成功等,或者增加尝试次数或使尝试次数可配置。
这篇博客文章 (尽管从2005年开始)显示了您的问题的可能解决方案:
使用转到
TryLabel: try { downloadMgr.DownLoadFile("file:///server/file", "c:\\file"); Console.WriteLine("File successfully downloaded"); } catch (NetworkException ex) { if (ex.OkToRetry) goto TryLabel; }
写一个包装器
public static bool Wrapper(DownloadManager downloadMgr) { try { downloadMgr.DownLoadFile("file:///server/file", "c:\\file"); return true; } catch (NetworkException ex) { Console.WriteLine("Failed to download file: {0}", ex.Message); return (!ex.OkToRetry); } } static void Main(string[] args) { while (!Wrapper(downloadMgr)) ; }