处理异常,我是否必须捕获每个特定的异常?

时间:2012-03-09 09:34:58

标签: c# windows-phone-7 exception-handling

这是我一直在想的事情。我是否需要通过捕获特定异常来处理KeyNotFoundException,或者我可以使用这样的“空白”捕获:

try
{
    //Code goes here
}
catch
{
}

或者我必须这样做:

try
{
    //Code goes here
}
catch(Exception ex)
{
}

或者我必须这样做:

try
{
    //Code goes here
}
catch(KeyNotFoundException ex)
{
}

我之所以要问的是,当我查看App Hub的崩溃计数时,我遇到了很多与“KeyNotFoundException”相关的崩溃,但我从来没有在我的应用程序中遇到任何崩溃。这可能是问题,我没有捕获到特定的异常,即使处理了异常,App Hub崩溃统计信息也将其归类为崩溃?

编辑: 以下是App Hub崩溃统计信息(Stack Trace)的一些屏幕截图。有谁知道详细它意味着什么?它与我的后台代理有关,这可能是我从未在我的应用程序中遇到任何崩溃的原因:

enter image description here

enter image description here

enter image description here

6 个答案:

答案 0 :(得分:3)

不,市场只计算未处理的异常,因此您的应用程序确实崩溃了。

空捕获或捕获异常是最常见的捕获(每个异常都是从Exception基类派生的,因此您正在捕获所有内容。),关键代码是您不使用try-catch的地方。根据例外情况,您应该检查您的词典并考虑可能导致错误的条件。

通常一个好的做法是检查公共方法中参数的正确性,这样如果出现任何问题,您可以提供更多有用的错误消息,例如:

public User GetUser(string username)
{
    if (String.IsNullOrEmpty(username))
        throw ArgumentNullException("username");
    return this.users[username];
}

在这种情况下,如果出现问题,您将看到您使用null作为用户名,否则您将看到KeyNotFoundException。希望这有帮助,祝你好运!

答案 1 :(得分:2)

您可以使用基本异常来捕获更多派生的异常,因此Exception将捕获KeyNotFoundException,因为后者继承了前者。严格地说,如果你想捕捉“任何”例外,catch (Exception)就足够了。

但是,如果您能以某种有意义的方式处理异常,则应该只捕获异常。虽然我不确定这种思维方式如何与WP开发相媲美。

至于你的根本问题,我不知道。 App Hub是否没有提供崩溃周围的任何细节,例如堆栈跟踪?

您最好的办法是保留模板代码,以便注册未处理的例外事件,并将一些日志记录放入您的应用程序,以便尽可能详细地记录崩溃期间应用程序状态。

答案 2 :(得分:1)

不,您不必在try / catch块中捕获每个特定的异常类型,请参阅C# language reference

但是,您可能希望添加异常处理逻辑并登录到Application.UnhandledException事件的处理程序,而不是将所有代码包装在try / catch块中。有关如何处理此事件的示例,请参阅this excellent blog post

答案 3 :(得分:1)

如果您对某个特定异常感兴趣,例如代码的特定部分中的KeyNotFoundException,那么您可以像这样抓住它

try
{
    //Code goes here
}
catch(KeyNotFoundException ex)
{

}

如果你想捕捉一个特定的异常和一些未定义的异常,你可以做这样的事情

try
{
    //Code goes here
}
catch(KeyNotFoundException ex)
{

}
catch(Exception ex)
{

}

如果您想确保您的应用程序没有崩溃,请将Collin的示例与Application.UnhandledException事件一起使用。

答案 4 :(得分:1)

您可以通过捕获基类来捕获所有异常,但是否是否依赖于您尝试实现的目标。

一般来说,您应该只捕获一个例外,在该级别您有知识决定应该对错误做什么,即回滚某些操作,或向用户显示消息。通常情况下,在某个级别捕获特定的异常类型是有意义的,因为该级别的代码理解这意味着什么,但是捕获所有异常可能没有意义。

避免过早捕捉所有内容,存在异常以告诉您某些事情是错误的,全面捕捉忽略了这一点并且可能意味着您的程序继续运行,但开始表现错误,可能会破坏数据。它通常更好地提前失败并且快速失败"收到意外的例外时。

答案 5 :(得分:1)

正如其他人所说 - 不 - 你不需要需要来捕获特定的异常,捕获异常或者只是catch会阻止异常冒泡。

但是应该只是在可能的情况下捕获特定的异常,以使代码在其正在执行的操作中更加明确。在潜在的错误条件之前再次测试正确性 - 再次在其他帖子中介绍。

对于您的特定问题,您发布的链接似乎表明从隔离存储中读取值是一个问题(IsolatedStorage.get_Item) - 所以无论您在ScheduledTaskAgent调用期间访问IsolatedStorage,您都需要确保该项目存在之前在做了。也许有一些配置设置缺失或什么?