C# 具有自定义错误信号的条件行为
我正在从事一个.NET项目,在这个项目中,团队决定避开异常惯例,转而使用自定义错误信号。在实践中,这个概念运行得很好,除了有一个令人讨厌的副作用:我发现自己在决定是否继续之前不断检查中间错误代码:C# 具有自定义错误信号的条件行为,c#,.net,error-handling,C#,.net,Error Handling,我正在从事一个.NET项目,在这个项目中,团队决定避开异常惯例,转而使用自定义错误信号。在实践中,这个概念运行得很好,除了有一个令人讨厌的副作用:我发现自己在决定是否继续之前不断检查中间错误代码: var error = DoSomething(); if( !error.Success ) return error; return DoSomethingElse(); 我想做的事情如下: DoSomething().ReturnIfError(); return DoSometh
var error = DoSomething();
if( !error.Success )
return error;
return DoSomethingElse();
我想做的事情如下:
DoSomething().ReturnIfError();
return DoSomethingElse();
我知道一些语言,比如Ruby,支持“return if”构造——C#中有这样的东西吗,或者可以在扩展方法中执行此操作吗?执行单个通用类来检查错误,并在整个代码中调用该类或静态方法。执行单个通用类来检查错误,并在整个代码中调用该类或静态方法。这不是可以巧妙入侵的使用扩展方法 在您给出的第二个示例中(使用理论方法链接),您将
- 呼叫
DoSomething
- 如果
出错,请调用DoSomething
returnierror
- 然后调用
DoSomethingElse
return
关键字提前脱离方法块
假设这是您真正想要做的,那么下面的代码可以实现这一点(我不推荐!)
使用系统;
命名空间控制台应用程序6
{
公共静态类类实用程序
{
public static void CallOnError(此TIn值,函数fn,操作错误fn)
在哪里上课
{
如果(!fn(值))
{
误差fn(值);
}
}
}
公共类TestClass
{
公共bool FirstCall(bool值)
{
控制台。WriteLine(“第一次呼叫”);
返回值;
}
公开作废第二次调用()
{
控制台。WriteLine(“第二次呼叫”);
}
公共无效第三方调用()
{
控制台。WriteLine(“第三次呼叫”);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var testClass=新的testClass();
testClass.CallOnError(tc=>tc.FirstCall(false),
tc2=>tc2.SecondCall());
testClass.CallOnError(tc=>tc.FirstCall(true),
tc2=>tc2.SecondCall());
testClass.ThirdCall();
Console.ReadLine();
}
}
}
这不是可以用扩展方法巧妙地入侵的东西
在您给出的第二个示例中(使用理论方法链接),您将
- 呼叫
DoSomething
- 如果
出错,请调用DoSomething
returnierror
- 然后调用
DoSomethingElse
return
关键字提前脱离方法块
假设这是您真正想要做的,那么下面的代码可以实现这一点(我不推荐!)
使用系统;
命名空间控制台应用程序6
{
公共静态类类实用程序
{
public static void CallOnError(此TIn值,函数fn,操作错误fn)
在哪里上课
{
如果(!fn(值))
{
误差fn(值);
}
}
}
公共类TestClass
{
公共bool FirstCall(bool值)
{
控制台。WriteLine(“第一次呼叫”);
返回值;
}
公开作废第二次调用()
{
控制台。WriteLine(“第二次呼叫”);
}
公共无效第三方调用()
{
控制台。WriteLine(“第三次呼叫”);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var testClass=新的testClass();
testClass.CallOnError(tc=>tc.FirstCall(false),
tc2=>tc2.SecondCall());
testClass.CallOnError(tc=>tc.FirstCall(true),
tc2=>tc2.SecondCall());
testClass.ThirdCall();
Console.ReadLine();
}
}
}
您的意思是返回要运行的方法()还是返回MethodName.?。因为在您的案例中,var error将返回true或false。。如果我没有看错的话。。是否要返回要运行的方法?例如,如果要返回其自身的方法名。。查看此链接,它将有希望给你一个关于做什么和如何做的想法。。假设我正确地理解了你的问题。。这个例子相当做作。。。关键是,如果没有检测到错误,我想继续执行,而不仅仅是执行一个方法。您是说返回要运行的方法()还是MethodName..?。因为在您的情况下,var error将返回true或false。。如果我没有看错的话。。是否要返回要运行的方法?例如,如果要返回其自身的方法名。。查看此链接,它将有希望给你一个关于做什么和如何做的想法。。假设我正确地理解了你的问题。。这个例子相当做作。。。关键是,如果没有检测到错误,我想继续执行,而不仅仅是执行一个方法。我担心情况就是这样。谢谢你的意见。我恐怕是这样的。谢谢你的意见。
using System;
namespace ConsoleApplication6
{
public static class ClassUtility
{
public static void CallOnError<TIn>(this TIn value, Func<TIn, bool> fn, Action<TIn> errorFn)
where TIn : class
{
if (!fn(value))
{
errorFn(value);
}
}
}
public class TestClass
{
public bool FirstCall(bool value)
{
Console.WriteLine("First call.");
return value;
}
public void SecondCall()
{
Console.WriteLine("Second call.");
}
public void ThirdCall()
{
Console.WriteLine("Third call.");
}
}
class Program
{
static void Main(string[] args)
{
var testClass = new TestClass();
testClass.CallOnError(tc => tc.FirstCall(false),
tc2 => tc2.SecondCall());
testClass.CallOnError(tc => tc.FirstCall(true),
tc2 => tc2.SecondCall());
testClass.ThirdCall();
Console.ReadLine();
}
}
}