这是我一直在想的事情。我是否需要通过捕获特定异常来处理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)的一些屏幕截图。有谁知道详细它意味着什么?它与我的后台代理有关,这可能是我从未在我的应用程序中遇到任何崩溃的原因:
答案 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,您都需要确保该项目存在之前在做了。也许有一些配置设置缺失或什么?