当执行太多不受信任的代码时,除去令人讨厌的大量 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受信任站点,才能完全正常运行访问,在没有域的情况下,可能要通过管理员手动设置,或者通过其它网络推送方法来设置. 有了域之后,这项工作就可以很好的 ...
随机推荐
- Jersey 2 + Maven + Tomcat + IntelliJ IDEA 搭建RESTful服务
本文参考以下内容: [1] Starting out with Jersey & Apache Tomcat using IntelliJ [2] [Jersey]IntelliJ IDEA ...
- PHP 微信分享
share.php <?php //公众号设置一下 JS接口安全域名,不要http,www的一级域名,比如http://www.baidu.com域名下的某个路径要分享,js安全域名中只需填上 ...
- style设置/获取样式的问题 和 offsetWidth/offsetHeight的问题
style设置/获取样式的问题:1.js通过style方法 --加样式:加的是行间样式 oDiv.style.width="20"+'px'; --取样式:取得是行间样 ...
- spring中用到哪些设计模式
1.工厂模式,这个很明显,在各种BeanFactory以及ApplicationContext创建中都用到了: 2.模版模式,这个也很明显,在各种BeanFactory以及ApplicationCon ...
- python 学习随笔
要求: 用户输入一个数,比如输入387. 需要把387打乱,然后将这三个数组合成最大数输出. 如果最大值和用户输入的等大,输出-1. 方法一: #!/user/bin/env python # _*_ ...
- Flags-Ural1225简单递推
Time limit: 1.0 second Memory limit: 64 MB On the Day of the Flag of Russia a shop-owner decided to ...
- cocos2dx && Lua 环境配置
需要的材料: 1.vs2013 2.python-2.7.3(2.7.x高于2.7的版本可能会出现错误) 3.Sublime Text 2(破解的) 4.cocos2dx-3.2 步骤: 1.安装vs ...
- 2017年1月2日 星期一 --出埃及记 Exodus 21:28
2017年1月2日 星期一 --出埃及记 Exodus 21:28 "If a bull gores a man or a woman to death, the bull must be ...
- 2016年12月30日 星期五 --出埃及记 Exodus 21:25
2016年12月30日 星期五 --出埃及记 Exodus 21:25 burn for burn, wound for wound, bruise for bruise.以烙还烙,以伤还伤,以打还打 ...
- 2016年12月28日 星期三 --出埃及记 Exodus 21:23
2016年12月28日 星期三 --出埃及记 Exodus 21:23 But if there is serious injury, you are to take life for life,若有 ...