我现在正在为一些数据操作编写一个API,我遇到了一个我无法自己回答的问题:D
我创建了一个扩展.net Application Exception类的异常类,因为我想在每次API抛出异常时添加一些要执行的功能。 例如,我想通过短信和电子邮件提醒错误消息和堆栈跟踪,我想通过Log4net记录内部异常。我不知道这是否适合与自定义异常类一起使用,或者我是否过度使用了自定义异常的含义。
我已阅读this article有关如何在c#中扩展异常的内容 所以这里我们用我的代码示例:
public class CustomExceptionClass : Exception
{
/// <summary>
/// I use custom functionality here everytime this exception occures
/// </summary>
/// <param name="errorMessage">error message</param>
/// <param name="innerEx">Inner exception that cause this exception</param>
public MyCustomException(string errorMessage, Exception innerEx) : base(errorMessage, innerEx)
{
//log exception
_log.ErrorFormat(errorMessage, innerEx);
//alert via sms and email
AlertMailer.SendAlertMessage(errorMessage, innerEx, innerEx.Message);
}
}
答案 0 :(得分:4)
我认为通过抛出自定义异常进行日志记录和警报是一种有效的技术。
但是,您不应该在异常构造函数中执行日志记录和警报。相反,您应该在API的所有入口点捕获自定义异常,并在catch块中执行日志记录和警报。例如:
void MyApiFunction()
{
try
{
// do data manipulation
}
catch(MyCustomException ex)
{
_log.ErrorFormat(ex.ErrorMessage, ex.InnerEx);
AlertMailer.SendAlertMessage(ex.ErrorMessage, ex.InnerEx);
}
}
答案 1 :(得分:1)
我建议你改用APP。
PostSharp exception handling
答案 2 :(得分:1)
应使用自定义异常来定义不同类型的异常。
它们应该非常简单,除了分配变量之外不包含其他逻辑。为什么?因为如果异常构造函数抛出另一个异常,您将很难跟踪它。
我处理这些例外的方式是:
在程序中
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
try {
//do something
} catch(Exception e) {
//log error
}
}
}
}
或在网站
public class ApplicationErrorModule : IHttpModule {
public void Init(HttpApplication context) {
context.Error += new EventHandler(context_Error);
}
private void context_Error(object sender, EventArgs e) {
//log error
}
}
答案 3 :(得分:0)
记录和发送电子邮件等重度处理不属于异常的构造函数。您应该使用AOP作为@petro建议或在catch语句中处理异常。