尝试/ 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。 换句话说,如果你知道using
variables的初始化可能会抛出一个特殊的exception,我用try-catch
包装它。 同样的,如果在using
body的时候可能会发生一些与使用中的variables没有直接关系的东西,那么我会用另外一个try
来包装这个特殊的exception。 我很less在我的catch
使用Exception
。
但我喜欢IDisposable
和using
虽然所以我可能有偏见。
如果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。