【问题标题】:How can I find out what kind of exceptions can be thrown by a method?如何找出方法可以抛出什么样的异常?
【发布时间】:2014-11-04 14:47:33
【问题描述】:

我正在编写调用Windows.Networking.PushNotifications中存在的以下方法的代码

// Summary:
//     Creates objects that you use to retrieve push notification channels from
//     the Windows Push Notification Services (WNS). These channels are bound to
//     an app or secondary tile.
[Threading(ThreadingModel.MTA)]
[Version(100794368)]
public static class PushNotificationChannelManager
{
    // Summary:
    //     Creates an object, bound to the calling app, through which you retrieve a
    //     push notification channel from Windows Push Notification Services (WNS).
    //
    // Returns:
    //     The object, bound to the calling app, that is used to request a PushNotificationChannel
    //     from the Windows Push Notification Services (WNS).
    [Overload("CreatePushNotificationChannelForApplicationAsync")]
    public static IAsyncOperation<PushNotificationChannel> CreatePushNotificationChannelForApplicationAsync();

}

我想确保涵盖所有可能引发异常的情况并适当地处理每一种情况。我是否有可能获得一个列表,其中列出了这可能引发的不同类型的异常以及可能导致它们的不同情况?

我不想只包罗万象

catch(Exception ex) { }    

This MSDN article 声明“如果在没有数据连接的情况下尝试注册 WNS 推送通知通道,则会引发异常”。但是它没有说明什么类型的异常或者是否有其他情况可以抛出异常。

如何确定是否存在其他可能的异常类型?

【问题讨论】:

  • 你应该关心处理另一个代码抛出的异常吗?这是处理自定义异常的代码责任。你应该做的就是全部抓住。
  • 另请参阅stackoverflow.com/questions/986180/… 了解有关同一主题的更多信息。

标签: c# .net exception exception-handling


【解决方案1】:

唯一的方法是文档和源代码,尽管请注意可能会引发许多其他异常,例如OutOfMemoryExceptionTypeLoadExceptionThreadAbortException 和...所以我认为正确的方法是捕获异常可以对它们做点什么,让其他人在调用堆栈中冒泡。

也读过这个Vexing exceptions

【讨论】:

  • 为什么要测试不同的错误代码? @DaveDev
【解决方案2】:

如果您可以模拟该链接中提到的错误条件之一,您应该能够使用通用异常捕获来查看引发的类型。

尽管根据文章中提到的错误代码,我认为它会抛出System.Runtime.InteropServices.COMException

【讨论】:

  • 开始测试不同的错误代码感觉非常不面向对象。
  • 我同意,但由于文档没有准确地告诉你,这是一个很好的起点。其他选项是获取代码,使用 .NET Reflector 之类的东西,或者向 Microsoft 提交票证并询问...
【解决方案3】:

我想确保涵盖所有可能引发异常的情况并适当处理每种情况

不可能涵盖所有可以引发异常并适当处理的情况。

如果您完全了解可能引发特定异常的情况,并且您了解程序的不变量,并且知道它们仍然有效或如何恢复它们,那么您可以从 中恢复 例外。

但是,例如,您可能会遇到由宇宙射线引起的异常,该异常会破坏机器的状态,从而导致访问冲突。你将如何从中恢复?总有一个时刻,程序必须举手并寻呼支持人员。

【讨论】:

    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多