尝试/ catch +使用,正确的语法

哪一个:

using (var myObject = new MyClass()) { try { // something here... } catch(Exception ex) { // Handle exception } } 

要么

 try { using (var myObject = new MyClass()) { // something here... } } catch(Exception ex) { // Handle exception } 

我更喜欢第二个。 也可以捕捉与创build对象有关的错误。

由于使用块只是try / finally( MSDN )的语法简化,所以我个人会采用以下方法,尽pipe我怀疑它与第二个选项有很大不同:

 var myObject = null; try{ myObject = new MyClass(); //important stuff } catch (Exception ex){ //handle exception } finally { if(myObject is IDisposable) ((IDisposable)myObject).Dispose(); } 

这取决于。 如果您使用Windows Communication Foundation(WCF),如果using语句中的代理处于exception状态,则using(...) { try... }将无法正常工作,即处置此代理将导致另一个exception。

就我个人而言,我相信在最小的处理方法,即只处理你在执行点意识到的exception。 换句话说,如果你知道usingvariables的初始化可能会抛出一个特殊的exception,我用try-catch包装它。 同样的,如果在using body的时候可能会发生一些与使用中的variables没有直接关系的东西,那么我会用另外一个try来包装这个特殊的exception。 我很less在我的catch使用Exception

但我喜欢IDisposableusing虽然所以我可能有偏见。

如果catch语句需要访问在using语句中声明的variables,那么inside就是唯一的select。

如果你的catch语句需要在使用前引用的对象,那么里面是你唯一的select。

如果你的catch语句需要一个不知道持续时间的动作,比如向用户显示一个消息,并且在这种情况发生之前你想要处理你的资源,那么外部是你最好的select。

每当我有一个与此类似的scenerio时,try-catch块通常使用不同的方法从使用中调用堆栈。 知道如何处理发生在其中的exception的方法不是典型的。

所以我的一般推荐是外面的。

 private void saveButton_Click(object sender, EventArgs args) { try { SaveFile(myFile); // The using statement will appear somewhere in here. } catch (IOException ex) { MessageBox.Show(ex.Message); } } 

两者都是有效的语法。 这真的归结为你想要做的事情:如果你想捕捉有关创build/处理对象的错误,请使用第二个。 如果没有,请使用第一个。

有一件重要的事情我会在这里调用:第一个不会捕获任何由调用MyClass构造函数引起的exception。