可以为每个 dll 甚至每个类创建自定义异常类。对于每个抛出的自定义异常,创建一个自定义 Id 以及用于跟踪的描述以及用于控制向用户显示的消息的描述。 ID 或 ID 范围决定了向用户显示的友好消息。通过这种方式,您可以确定已捕获和处理的异常、未捕获和未处理的异常、自定义异常,还可以跟踪、分类和查找引发异常的代码等等。要将日志记录添加到组合中,您可以使用 log4net 或 common.logging(与 Entlib 一起使用)。这使得日志记录变得容易,因为它易于使用和实现,并且内置了用于记录所有有用信息的异常的功能,并且可以在应用程序范围内使用。
添加:
我想我可能把 Base Exception Class 弄错了,你会注意到 DebugFormat 和 ErrorFormat,这是我们修改后的 log4net 代码,但我认为你明白了。
namespace Playing.Service
{
public class UserService
{
private static readonly ILog log = LogManager.GetLogger(typeof(UserService));
public void SaveUser(string username, string firstName, string lastName)
{
try
{
Playing.Repository.UserRepository repository = new Repository.UserRepository();
repository.SaveUser(username, firstName, lastName);
log.DebugFormat("Saved User Info");
}
catch (Repository.RepositoryException rex)
{
log.ErrorFormat("Repository Could Not Save User Information: {0}\n Error Message: {1}\nStack Trace: {2}", rex.Message, rex, rex.StackTrace);
throw new ServiceException(rex.Message, 2400);
}
catch (Exception ex)
{
log.ErrorFormat("Could Not Save User Information: {0}\n Error Message: {1}\nStack Trace: {2}", ex.Message, ex, ex.StackTrace);
throw new ServiceException(ex.Message, 12400);
}
}
}
public class ServiceException : Playing.Common.BaseException
{
public ServiceException(string errorMessage) : base(errorMessage) {}
public ServiceException(string errorMessage, int errorID) : base(errorMessage, errorID) {}
public ServiceException(string errorMessage, params string[] args) : base(errorMessage, args) { }
}
}
namespace Playing.Repository
{
public class UserRepository
{
private static readonly ILog log = LogManager.GetLogger(typeof(UserRepository));
public void SaveUser(string username, string firstName, string lastName)
{
try
{
//Save data in Database
log.DebugFormat("Saved User Info Into Databse");
}
catch (Exception ex)
{
log.ErrorFormat("Could Not Save User Information: {0}\n Error Message: {1}\nStack Trace: {2}", ex.Message, ex, ex.StackTrace);
throw new RepositoryException(ex.Message, 3400);
}
}
}
public class RepositoryException : Playing.Common.BaseException
{
public RepositoryException(string errorMessage) : base(errorMessage) {}
public RepositoryException(string errorMessage, int errorID) : base(errorMessage, errorID) {}
public RepositoryException(string errorMessage, params string[] args) : base(errorMessage, args) {}
}
}
namespace Playing.Common
{
public class BaseException : Exception
{
public BaseException(string errorMessage) : base(errorMessage) {}
public BaseException(string errorMessage, int errorID) : base(errorMessage)
{
StringBuilder error = new StringBuilder();
error.Append("(");
error.Append(errorID);
error.Append("): ");
error.Append(errorMessage);
errorMessage = error.ToString();
}
public BaseException(string errorMessage, params string[] args) : base(errorMessage)
{
errorMessage = string.Format(errorMessage, args);
}
}
}