【问题标题】:scope when surrounding 'new' statement with try/catch in c#在 c# 中使用 try/catch 包围“new”语句时的范围
【发布时间】:2011-05-31 02:45:51
【问题描述】:

这是一个关于什么是声明新变量的“最佳实践”的问题,我已经见过这种情况几次了。我有一个类,其构造函数读取配置文件,例如:

ConfigMgr config = new ConfigMgr(args[0]);

当然,如果您在没有该参数的情况下运行控制台应用程序,则会导致异常。如果我按如下方式用 try/catch 包围该行,则会收到错误消息“当前上下文中不存在名称 'config'”。可以理解。

try
{
    ConfigMgr config = new ConfigMgr(args[0]);
}
catch
{
    Console.WriteLine("Config file not specified or incorrect in format.  Exiting.");
    Console.ReadLine();
}

// Defaults
string aucomposingfile = config.getValue("aucomposingfile");
string nzcomposingfile = config.getValue("nzcomposingfile");
...etc

我可以在构造函数中分离出需要参数的部分 - 在 try/catch 块之外执行新的 ConfigMgr 部分,然后在 try/catch 中执行类似 config.LoadFile() 的操作。但我无法想象那些知情人士会这样做。

有什么想法吗?

谢谢!

【问题讨论】:

  • 为什么你认为它错了......我想每个人都这样做
  • 感谢大家的cmets。我不确定将哪一个标记为答案,因为两个答案都很好地解释了它。任何建议表示赞赏(底部是“第一个”答案)?两者都得到我的支持!

标签: c# .net constructor try-catch scope


【解决方案1】:

你没有理由不能这样做:

ConfigMgr config = null;
try
{
    config = new ConfigMgr(args[0]);
}
catch ( /* catch a specific exception!! */ ) 
{
    //log it:
    Console.WriteLine("Config file not specified or incorrect in format.  Exiting.");

    //escape from here, because you don't want to continue:
    throw;    
}

string aucomposingfile = config.getValue("aucomposingfile");
string nzcomposingfile = config.getValue("nzcomposingfile");

当然,可以说更正确的方法可能是在尝试使用它们之前检查命令行参数,如果它们不符合您的要求,则抛出一个特定的异常 - 您依赖它们,所以首先验证它们。这比仅仅尝试使用它们并捕获异常具有更好的代码流。这样,您的 catch 块将更加关注配置文件更具体的问题,而不是处理命令行参数的问题。

【讨论】:

  • 谢谢。关于首先验证的评论也很有意义。干杯
【解决方案2】:

如果您需要访问的变量不仅仅是try 块,则需要在块之前声明初始化变量。简单地声明和初始化为 null 就足够了。

Foo foo = null;
try 
{
    foo = DoSomethingToGetFoo();
}
catch (SpecificException ex)
{
    // do whatever, foo is accessible but may require null-checking
}
finally 
{
    // ditto 
}

// still accessible

显然,如果您希望在其他地方访问该变量,则必须在外部范围内声明该变量。但初始化也是必要的,因为 C# 编译器需要证明变量在允许您使用之前已经初始化。如果“标准”初始化程序在 try 的范围内,编译器不能保证它在以后使用之前已经发生。

对于您自己的代码,您可以决定是否需要对变量执行的所有操作都包含在try 中。如果是这样,显然将其范围限制在该块。但在某些情况下,您需要更广泛的范围。 (参见:usingIDisposable 对象的扩展。)

【讨论】:

  • 感谢安东尼的评论。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2011-05-04
  • 2012-03-29
  • 2021-03-17
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多