使用try / catch / finally声明和使用变量的最佳做法/建议是什么?。
我们是否必须在try块的外侧声明变量并在finally上进行处理?或者在try block中声明并自动处理?
string Name = String.Empty;
try
{
//do work
}
catch
{
//safely access s
Console.WriteLine(Name);
}
OR
string Name;
try
{
//do work
}
catch
{
if (!String.IsNullOrEmpty(Name))
{
//safely access s
Console.WriteLine(Name);
}
}
答案 0 :(得分:1)
这取决于您需要的范围以及您要对变量执行的操作。如果您在try
块中声明它,则无法使用block
之外的变量,甚至不能在catch
块中使用该变量。这与catch
必须处理异常情况并且finally
始终能够执行的事实有关。在try
范围内声明变量时,如果抛出异常,则不知道它是否已初始化。并且您永远不知道变量是否在try/catch
块之后被初始化。因此,如果你想在catch / finally或更高版本的代码中使用一个变量,你可以更安全并在之前声明它(这样你总是可以确定你可以处理finally块中的处理)。但是,总是尽量给你的变量尽可能小的范围。因此,如果您确定在try
范围之外不需要它,请在try
内声明。
我的意思的一个例子:
try
{
throw new SomeException("It goes wrong here");
string iNeedThisVariable = "but i never get initialized";
}
catch (SomeException e)
{
Console.Out.WriteLine(iNeedThisVariable); //This goes wrong, since you need to show the string, but it has never been initialized
}
finally
{
Console.Out.WriteLine(iNeedThisVariable); //Also can't use it here!
}
答案 1 :(得分:0)
这取决于变量的类型,
如果它是任何com组件,如connection,dataReader,filestream句柄,你认为对象需要手动关闭,你应该在try之外声明它们并最终处理它们。
如果您有正常类型的变量,就像您提到的那样,它将被自动销毁,无需处置它们。
处理COM组件的更好方法是使用这样的方法。
using(var test = new Object())
{//Do Coding here
}