【问题标题】:why my exception shown like this?为什么我的异常会这样显示?
【发布时间】:2014-05-20 17:50:26
【问题描述】:

我创建了自己的类库,我有这样的create() 方法:

public  int create()
{
    try
    {
        if(path!=null){
        //do somethings
        }
        else{
        throw new ArgumentNullException("path cannot be null ro empty", "path");
        }
        catch{
        throw;
        }
        return 0;
    }
}

在另一个项目中,我添加了我的类库 DLL,当我使用我的库方法时,由于某些原因,例如 path=null,我的方法抛出了一个异常,我得到了我在 catch 中写的 throw 的行。 .. 我不希望这样,我如何在我的项目中调用create() 方法时遇到错误

谢谢

对不起,我不太懂英语,所以我再次尝试说出我的意思 我尝试创建类库,我想将它提供给其他人使用,我希望当我的 create() 方法中抛出的异常 Visual Studio 突出显示调用 create 方法的行,但它打开我的 dll 并去创建方法并突出显示我写的行 throw;... 我该如何解决?

.................................................. ....................................

终于找到答案了,看这个链接: Hiding code from a DLL while debugging

【问题讨论】:

  • 我不知道你在问什么。请重新格式化并重新表述您的问题,因为我现在无法理解您想要什么。
  • 啊我想我明白你的意思了,只需删除 try catch 块
  • @siamak 我想你想从调用函数的地方捕获异常??
  • 对不起,我不太懂英语,我尝试创建类库,我想把它交给其他人使用,我想在我的 create() 方法中抛出异常时 Visual Studio 突出显示调用创建方法的行,但它打开我的 dll 并转到创建方法并突出显示我写的行 throw;... 我该如何解决它
  • 我终于找到了答案,请参阅此链接:[在调试时隐藏 DLL 中的代码][1] [1]:stackoverflow.com/questions/17484053/…

标签: c# exception


【解决方案1】:

要在您抛出异常时将调试器停止在正确的行,您所要做的就是删除您的 try catch 块(无论哪种方式,这在您的情况下都是完全没有必要的):

public  int create()
{      
    if(path==null)
        throw new ArgumentNullException("path", "path cannot be null or empty");

    // do something

    return 0;
}

同样正如 Oscar 指出的,你应该在抛出异常时切换参数,因为第一个参数是参数名称,第二个参数是消息。

【讨论】:

  • 我删除了 try catch 块,但是当我的 create() 方法中抛出异常时,Visual Studio 打开我的 dll 并转到创建方法并突出显示我写的行 throw;我希望它突出显示用户调用 create 方法的行
  • @siamak 然后您必须使用“Release”(无调试信息)构建您的 dll,然后在您的项目中引用该 dll。用户只有在他的机器上有该 dll 的源代码时才能看到该行,通常情况并非如此
【解决方案2】:

您已经交换了 ArgumentNullException 构造函数的参数。首先是参数名称,然后是消息。

public ArgumentNullException(
    string paramName,
    string message
)

http://msdn.microsoft.com/es-es/library/k8a0dfcy(v=vs.110).aspx

此外,您可以安全地删除 catch 子句,因为您在那里什么都不做。只捕获你想以某种方式处理的异常,否则,让它冒泡。

【讨论】:

    【解决方案3】:

    当你重新抛出一个异常时,每个方法中只保存一个堆栈帧,因此,你无法找出是哪一行抛出了异常,只能找到重新抛出异常的那一行。您可以在第一次捕获消息时记录该消息,或者不重新抛出而是抛出一个新异常,并将捕获的异常作为内部异常提供。

    【讨论】:

      【解决方案4】:

      您可以在尝试前进行检查:

      public  int create(){
       if(path!=null){
           try{
      
           //do somethings
            }
           catch{
            throw;
        }
        else{
            throw new ArgumentNullException("path cannot be null ro empty", "path");
        }
        return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-02
        • 2021-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多