当执行太多不受信任的代码时,除去令人讨厌的大量 trycatch 的办法

Posted 大胡子毛绒老头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当执行太多不受信任的代码时,除去令人讨厌的大量 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 = 1,
    /// <summary>
        /// <see cref="IfElse.Condition"/>返回 false。
        /// </summary>
    C1 = 2,
    /// <summary>
        /// <see cref="IfElse.IfTrue"/>成功执行。
        /// </summary>
    T0 = 4,
    /// <summary>
        /// <see cref="IfElse.IfTrue"/>发生异常。
        /// </summary>
    T1 = 8,
    /// <summary>
        /// <see cref="IfElse.IfFalse"/>成功执行。
        /// </summary>
    F0 = 16,
    /// <summary>
        /// <see cref="IfElse.IfFalse"/>发生异常。
        /// </summary>
    F1 = 32,
    /// <summary>
        /// <see cref="IfElse.IfError"/>成功执行。
        /// </summary>
    E0 = 64,
    /// <summary>
        /// <see cref="IfElse.IfError"/>发生异常。
        /// </summary>
    E1 = 128,
    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 的办法的主要内容,如果未能解决你的问题,请参考以下文章

安全执行不受信任的 Haskell 代码

保护/清理不受信任的客户端对服务器的远程调用

将不受信任的java代码限制为单个线程[重复]

我的 GUI 表单后面令人讨厌的空白控制台

模拟共享主机信任级别

java 的 linq,不要再写令人讨厌的 for 了!