【问题标题】:VB.net is it possible to catch a thrown exception from a public classVB.net 是否可以从公共类中捕获抛出的异常
【发布时间】:2015-12-10 09:47:23
【问题描述】:

我正在编写一个使用 vb 类的程序。 在某些情况下,此类确实会执行Throw New ArgumentException("Error xyz")

我不想编辑这个类,并希望保持原样。 由于该类也被其他程序使用。

我的新程序应该有一个 try catch 以便捕获抛出的异常。我试图将来自类的命令放入主应用程序的 try catch 构造中,但我仍然从类中弹出异常,它没有被捕获。

有没有办法从子类中捕获那些抛出新异常?

更多解释 我使用现有的和平代码 DeviceHelper.vb 该代码以

开头
  Imports USBControl.NativeMethods
  Imports System.Runtime.InteropServices
  Imports System.ComponentModel
  Imports System.Text

  Public NotInheritable Class DeviceHelper

其中有一个私有子 SetDeviceEnabled

   Private Shared Sub EnableDevice(ByVal handle As SafeDeviceInfoSetHandle, ByVal diData As DeviceInfoData, ByVal enable As Boolean)

确实包含一行

  Throw New ArgumentException("That device can't be disabled! Look in the device manager!") 

我的主程序使用了 Devicehelper.vbs,但它无法捕捉到类似的异常

   Try
   DeviceHelper.SetDeviceEnabled(DeviceGuid, deviceID, False)
   Catch ex As Exception
   Console.Writeline(ex.Message)
   End Try

【问题讨论】:

  • 那么,try块中抛出了异常,并没有进入catch块?你能提供一个基本的例子来澄清问题吗?
  • 在 Throw 语句上设置断点,您可能会发现代码在不同的线程上运行。这不是您应该捕获的那种异常,它很可能是由您的程序中的错误触发的。也许您传递了错误的设备 guid 或 id,诸如此类。你无法捕捉和处理错误,处理错误需要修复你的代码。
  • 如果设备不支持 setdeviceEnabled ,就会发生这种情况;它确实对 kernel.dll 的调用有所帮助。你可能是对的,这不能被抓住,但我希望它可能。

标签: vb.net exception


【解决方案1】:

只需创建您自己的从上述公共类派生的类。下一步是像这样实现你的方法:(对不起,这段代码是用 C# 编写的,但思路应该很清楚)

public {fill return type} MyMethod( /* arguments */)
{
    try {
        return BaseMethod( /* arguments */);      // this method is from base class
    }
    catch(ArgumentException)
    {
    }
}

然后开始使用您的实现并调用您的方法。

【讨论】:

    【解决方案2】:

    我做了一个解决方法,尽管我不想编辑 de devicehelper.vb 由于多个 progs 使用它,我不得不改变它。 我添加了一个变量 hideErr,如果设置了,则跳过 Throw New 异常。我认为它的代码真的很脏,要做到这一点,但我没有看到其他选择

    【讨论】:

    • 为什么给这个负面评价?,我说这是一个肮脏的解决方法,我不认为这是一个好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    相关资源
    最近更新 更多