C# 处理未处理的异常
我有一个Ria服务来调用逻辑代码。我想在每个逻辑函数中编写try-catch块,以提供处理未处理异常的方法C# 处理未处理的异常,c#,exception,exception-handling,C#,Exception,Exception Handling,我有一个Ria服务来调用逻辑代码。我想在每个逻辑函数中编写try-catch块,以提供处理未处理异常的方法 try { //something } catch(BussinessException e) { //save e.info to database } 但是我不想在逻辑中的任何地方都写这个块代码,我也不想把异常处理部分放在RIA服务中,因为另一种类型的服务也调用这个逻辑 有谁能为我提供一个单一位置的异常处理解决方案吗?根据您的历史记录,我很确定这是C#,所以我的观点如下 避免重复的最
try
{
//something
}
catch(BussinessException e)
{
//save e.info to database
}
但是我不想在逻辑中的任何地方都写这个块代码,我也不想把异常处理部分放在RIA服务中,因为另一种类型的服务也调用这个逻辑
有谁能为我提供一个单一位置的异常处理解决方案吗?根据您的历史记录,我很确定这是C#,所以我的观点如下 避免重复的最好方法是这样包装您的逻辑
private static void ExecuteLogic(Action action)
{
try
{
action();
}
catch(BussinessException e)
{
//save e.info to database
}
}
有了它,您可以轻松地执行共享相同错误处理的各种操作
ExecuteLogic(
() =>
{
// Do something...
}
);
如果您只想记录异常,正如我从您的示例中看到的,您可以订阅。但你无法处理它。哦顺便说一句,此事件仅在.NET 4中介绍:(.这里是一个使用命令模式的更传统的面向对象解决方案
public interface ICommand {
void Execute();
}
public class BankAccountWebServiceCall: ICommand(){
string name;
int accountNo;
public BankAccountWebServiceCall(string name, int accountNo) {
this.name= param1;
this.accountNo= accountNo;
}
//ICommand implementation
public void Execute() {
SomeWebService.Call(name, accountNo);
}
}
public class WebServiceCaller {
public void CallService(ICommand command) {
try {
command.Execute();
} catch (SomeBusinessException ex) {
//handle exception
}
}
}
public class WebServiceCallerTest {
public static void CallServiceTest() {
new WebServerCaller().CallService(new TwoParameterwebServiceCall("Igor", 12345));
}
}
实现一个IHttpModule web.config:
<httpModules>
...
<add type="Citiport.Web.Module.ErrorHandleModule" name="GlobalErrorHandler" />
...
</httpModules>
参考:http://code.google.com/p/citiport2/source/browse/trunk/CitiportV2_website/App_Code/Web/ErrorHandleModule.cs。想问一个聪明的人。你能为类似的东西扩展IDispose吗?好主意坏主意?@Kieran-我相信你可以用无数种方式扩展IDispose。你能告诉我最终的目标是什么吗l你会想要吗?太好了!这很方便,也适合我们愚蠢的静态逻辑类。嘿,伙计。谢谢你的回答。我已经对idisposable进行了更多的研究,但它不像我最初认为的那样适用于此…这是我过去会使用的一种强大方法,但我的代码已经转向了更功能化的风格。这是一个伟大的依赖注入解决方案!
public class ErrorHandleModule : IHttpModule
{
private static readonly ILog logger = LogManager.GetLogger("Citiport.Web.Module.ErrorHandleModule");
public ErrorHandleModule()
{
}
void IHttpModule.Dispose()
{
}
void IHttpModule.Init(HttpApplication context)
{
context.Error += new System.EventHandler(onError);
}
public void onError(object obj, EventArgs args)
{
HttpContext ctx = HttpContext.Current;
HttpResponse response = ctx.Response;
HttpRequest request = ctx.Request;
Exception exception = ctx.Server.GetLastError();
/* handling exception here*/
}
}
}