c#中的异常(处理)

exception (handling) in c#

  catch (Exception ex)
  {
     _errorCode = ErrorCodes.SqlGeneralError;
     CommonTools.vAddToLog(ex, _errorCode, _userID);
     throw new JOVALException(_errorCode);
 }

我使用这段代码来处理名为 (JOVALException) 的自定义异常的错误,但是当发生异常时它会打开 "No source available" 页面并且告诉我那不是 堆栈跟踪 是空的 我该如何解决这个问题?

编辑

 public JOVALException(ErrorCodes _errCode, String _message = "")
        {
            ErrMessage = _message;
            ErrCode = _errCode;

        }

这是我的构造函数,如何修改它?

当您调用 throw new JOVALException(_errorCode); 时,您丢失了原始错误的堆栈跟踪。

就这样:

throw;

如果你需要抛出一个 JOVALException 你需要稍微修改你的 class:

class JOVALException : Exception
{
    public JOVALException(string errorCode, Exception innerException)
        : base(errorCode, innerException)
    {

    }
}

还有一个例子:

 try
 {
      int i = 0;
      int foo = i / i;
 }
 catch (Exception ex)
 {
     _errorCode = ErrorCodes.SqlGeneralError;
     CommonTools.vAddToLog(ex, _errorCode, _userID);
     throw new JOVALException(_errorCode, ex);
 }

ex 放入您的 JOVALException 作为 inner exception

public JOVALException(ErrorCodes _errCode, String _message = "",
  Exception innerException = null) : base(_message, innerException)
{
  ErrMessage = _message;
  ErrCode = _errCode;
}

我建议您通过添加构造函数来修改 JOVALException class:

  public class JOVALException: Exception {
    ...
    // Note Exception "innerException" argument
    public JOVALException(ErrorCodes _errCode, Exception innerException, String _message = "")
      : base(_message, inner) {
      ...
    }
  }

另一个问题:尽量避免代码重复

  ErrMessage = _message;

因为 ErrMessage 实际上是 Message 属性的重复;只需调用 base class 构造函数.

然后

  catch (Exception ex)
  {
     _errorCode = ErrorCodes.SqlGeneralError;
     CommonTools.vAddToLog(ex, _errorCode, _userID);
     throw new JOVALException(_errorCode, ex);  // <- Note "ex"
  }