我有一个CustomException
类,它是Exception
类之上的包装器。这是我在处理异常时使用的主要类。
public class CustomException : Exception
{
public string ErrorMessage { get; private set; }
public HttpStatusCode HttpStatusCode { get; private set; }
public CustomException(string errorMessage)
: this(errorMessage, HttpStatusCode.InternalServerError)
{ }
public CustomException(string message, HttpStatusCode httpStatusCode)
{
ErrorMessage = message;
HttpStatusCode = httpStatusCode;
}
}
当我想抛出异常时,我使用throw CustomException()
方法。
但是,我想在这个CustomException()之上创建一些包装器,例如:
public class ApplicationNotFoundException : Exception
{
public ApplicationNotFoundException(Application application)
{
string message = string.Format(@"Application ""{0}"" was not found", application.ApplicationName);
throw new CustomException(message, HttpStatusCode.NotFound);
}
}
我抛出异常行:throw new ApplicationNotFoundException(application)
基本上我从另一个异常中抛出异常。
这种做法不好吗?
答案 0 :(得分:2)
让ApplicationNotFoundException
的用户决定何时投掷。
不要在ApplicationNotFoundException的构造函数中执行此操作。
而是从CustomException
派生ApplicationNotFoundExceptionpublic class ApplicationNotFoundException : CustomException
{
public ApplicationNotFoundException(Application application)
{
string message = string.Format(@"Application '{0}' was not found", application.ApplicationName);
base.ErrorMessage = message
base.HttpStatusCode = HttpStatusCode.NotFound;
}
}
public class CustomException : Exception
{
public string ErrorMessage { get; internal set; }
public HttpStatusCode HttpStatusCode { get; internal set; }
public CustomException(string errorMessage)
: this(errorMessage, HttpStatusCode.InternalServerError)
{ }
public CustomException(string message, HttpStatusCode httpStatusCode)
{
ErrorMessage = message;
HttpStatusCode = httpStatusCode;
}
}
答案 1 :(得分:2)
这基本上不是使用exceptions
的方法
创建自定义exceptions
可满足您的自定义需求,如果内置异常无法处理此问题
有一些方法可供你使用:
CustomException
是您的“基础”类,而ApplicationNotFoundException
是派生类,这是专门化的首选方式。或
struct
)。修改强>
另外,这非常重要,请将stack unwinding
视为效率因素。抛出一个异常会强制解除调用堆栈,这也需要一点时间!
当然,你可以按自己的方式行事,但可能会收紧一点,这可能是不必要的。
对于某些背景,请考虑MSDN。
答案 2 :(得分:1)
常见的情况是重新抛出更具体的异常类型,而不是在catch块中而不是在构造函数中:
try {
... // Try to find application
}
catch(ApplicationNotFoundException ex) {
var message = ...;
throw new CustomException(message, HttpStatusCode.NotFound);
}
当重新抛出另一个异常时,可以使用原始异常设置InnerException属性以帮助调试。