当执行太多不受信任的代码时,除去令人讨厌的大量 trycatch 的办法
如果方法 Condition 返回 true,则执行 IfTrue,否则执行 IfFalse,发生异常则执行 IfError。
通常是这样:
try {
if (Condition()) {
try {
IfTrue();
} catch {
}
} else {
try {
IfFalse();
} catch {
}
}
} catch {
try {
IfError();
} catch {
}
}
现在可以这样:
public class IfElse {
/// <summary>
/// 预期的 <see cref="Condition"/> 的返回值。
/// </summary>
public bool Expect { private get; set; } = true;
/// <summary>
/// 当 <see cref="IfError"/> 为 null 时,是否使用 <see cref="IfFalse"/> 代替。
/// </summary>
public bool IfFalseAsIfError { private get; set; } = true;
/// <summary>
/// 如果返回 true,则将执行 <see cref="IfTrue"/>,否则执行 <see cref="IfFalse"/>,发生异常则执行 <see cref="IfError"/>。
/// </summary>
public Func<bool> Condition { private get; set; }
/// <summary>
/// 当 <see cref="Condition"/> 返回 true 时。
/// </summary>
public Action IfTrue { private get; set; }
/// <summary>
/// 当 <see cref="Condition"/> 返回 false 时。
/// </summary>
public Action IfFalse { private get; set; }
/// <summary>
/// 当执行 <see cref="Condition"/> 时发生异常时。
/// </summary>
public Action IfError { private get; set; }
/// <summary>
/// 每次获取的结果极有可能不一样。
/// </summary>
public bool Assert(IfElseResult result) {
IfElseResult r;
try {
var v = Condition?.Invoke() == Expect;
if (v == true) {
try {
IfTrue?.Invoke();
r = IfElseResult.TC0;
} catch {
r = IfElseResult.TC1;
}
} else {
try {
IfFalse?.Invoke();
r = IfElseResult.FC0;
} catch {
r = IfElseResult.FC1;
}
}
} catch {
try {
if (IfError == null) {
if (IfFalseAsIfError) {
IfFalse?.Invoke();
}
} else {
IfError?.Invoke();
}
r = IfElseResult.E0;
} catch {
r = IfElseResult.E1;
}
}
return (r | result) == r;
}
}
/// <summary>
/// <see cref="IfElse"/>的执行状态。
/// </summary>
public enum IfElseResult {
/// <summary>
/// <see cref="IfElse.Condition"/>返回 true。
/// </summary>
C0 = ,
/// <summary>
/// <see cref="IfElse.Condition"/>返回 false。
/// </summary>
C1 = ,
/// <summary>
/// <see cref="IfElse.IfTrue"/>成功执行。
/// </summary>
T0 = ,
/// <summary>
/// <see cref="IfElse.IfTrue"/>发生异常。
/// </summary>
T1 = ,
/// <summary>
/// <see cref="IfElse.IfFalse"/>成功执行。
/// </summary>
F0 = ,
/// <summary>
/// <see cref="IfElse.IfFalse"/>发生异常。
/// </summary>
F1 = ,
/// <summary>
/// <see cref="IfElse.IfError"/>成功执行。
/// </summary>
E0 = ,
/// <summary>
/// <see cref="IfElse.IfError"/>发生异常。
/// </summary>
E1 = ,
TC0 = C0 | T0, TC1 = C0 | T1, FC0 = C1 | F0, FC1 = C1 | F1, E = E0 | E1
}
调用:
new IfElse() {
Expect = true,
Condition = () => true,
IfTrue = () => { },
IfFalse = () => { },
IfError = () => { },
}.Assert(IfElseResult.TC0);
C#是最棒的强类型开发语言,尤其是从6.0开始。但还是更喜欢javascript。
当执行太多不受信任的代码时,除去令人讨厌的大量 trycatch 的办法的更多相关文章
- 在Postman中使用不受信任的SSL证书
阅读目录 第一种方案——临时添加到受信任的证书颁发机构: 第二种方案——永久添加到受信任的证书颁发机构: add by zhj: 在http://www.cnblogs.com/ajianbeyour ...
- 在Postman中使用不受信任的SSL证书(转)
add by zhj: 在http://www.cnblogs.com/ajianbeyourself/p/3898911.html中提到: 对于不受信任的证书,浏览器会发出告警,不过这些也只是告警而 ...
- 添加自签发的 SSL 证书为受信任的根证书
原文:http://cnzhx.net/blog/self-signed-certificate-as-trusted-root-ca-in-windows/ 添加自签发的 SSL 证书为受信任的根证 ...
- Chrome:不受信任的证书----openssl签发带Subject Alternative Name的证书
Chrome下自签名证书提示无效的问题 发现chrome验证证书很严格,必须带有Subject Alternative Name.签发csr时,修改openssl.cnf : vi /etc/ssl/ ...
- 出现could not find developer disk image解决办法和不受信任的开发者
真机测试问题 最近一直遇到这样的问题,很是让人心烦,但是还是要自己解决的,我也是从网上查了很多这样的解决办法,都没有成功,所以今天我要把自己的总结的方法和大家分享一下. iOS测试当中的问题 iOS ...
- 发现IE6的一个BUG,添加受信任站点后,页面无法跳转
最近客户爆了一个问题,说是最近使用我们的系统,一登录浏览器就直接关闭了. 经排查,属于IE6设置受信任站点的问题,受信任站点设置了通配符,如 http://192.168.1.* 这样的格式,而我 ...
- nginx https ssl 设置受信任证书[原创]
1. 安装nginx 支持ssl模块 http://nginx.org/en/docs/configure.html yum -y install openssh openssh-devel (htt ...
- 登录失败。该登录名来自不受信任的域,不能与 Windows 身份验证一起使用
登录失败.该登录名来自不受信任的域,不能与 Windows 身份验证一起使用 使用sever sql 远程连接数据库的时候遇到了这个问题,我用的是ADO.NET 实体数据模型,有web.config ...
- [转载]浅谈组策略设置IE受信任站点
在企业中,通常会有一些业务系统,要求必须加入到客户端IE受信任站点,才能完全正常运行访问,在没有域的情况下,可能要通过管理员手动设置,或者通过其它网络推送方法来设置. 有了域之后,这项工作就可以很好的 ...
随机推荐
- SAMSUNG某型号一千短信成功记录!对比其他软件恢复不成功的案列!
Hello! 大家好欢迎再次来到Dr.wonde的博客, 下面谈一下今天的案列,今年11月26号收到了一客户寄来的三星S4手机恢复里面短信, 如下图所示,用其他软件恢复以后,数据为零,没有恢复,,这下 ...
- 10-8位7段数码管驱动实验——小梅哥FPGA设计思想与验证方法视频教程配套文档
芯航线--普利斯队长精心奉献 实验目的: 1.实现FPGA驱动数码管动态显示: 2.使用In system sources and probes editor工具,输入需要显示在数码管上的的数据, ...
- docker 与 vmware 的区别
- 【ASM C/C++】 Makefile 规则说明
make 命令会自动读取当前目录下的 Makefile 文件[31],完成相应的编译步骤.Makefile 由一组规则(Rule)组成,每条规则的格式是:target ... : prerequisi ...
- Javascript > Eclipse > 自动代码规范化
Reference: http://blog.csdn.net/jmyue/article/details/11060003 大项目往往是有很多人一起完成的,然而每个人都有自己的style,导致整个项 ...
- [转载]LazyWriter(惰性写入器) 进程的作用
Q:What Does the LazyWriter Process Do? The LazyWriter process is a periodic process that checks th ...
- append追加的使用
#!/usr/bin/env python def fun(arg) : ret = [] for i in range(len(arg)) : if i % 2 ==1 : ret.append(a ...
- 基于东北F4的设计模式情景剧——第一幕 装饰模式(Decorator Pattern)
第一场 难题未解 布景:铁岭,晴天,午后,风.在一幢还算气派的写字楼的三层外墙上,挂着一条红色横幅,上面用歪歪扭扭的毛笔字写着"东北F4软件外包工作室".大风中,那早已褪色的条幅剧 ...
- oracle 开窗分析函数和树形结构
1.row_number() over(partition by ... order by ...)2.rank() over(partition by ... order by ...)3.dens ...
- Linux删除多个java进程的其中一个
一.背景: Linux后台运行了多个Java程序,进程名都是java. 执行pkill java会一次性杀掉所有的java进程. 二.解决思路: 先通过一定的检索条件,定位出指定的java进程 然后解 ...