【问题标题】:Pass block of code as parameter and execute in try catch将代码块作为参数传递并在 try catch 中执行
【发布时间】:2013-11-06 18:14:11
【问题描述】:

TL;DR:我想传递一些代码,这些代码将在 try catch 中执行 伪代码:

void ExecuteInTryCatch(BlockOfCode)
{
   try
   {
      execute BlockOfCode with possible return value
   }
   catch (MyException e)
   {
      do something
   }
}

长版:我正在编写 Web 应用程序的自动化测试,并希望执行一些代码,这些代码将捕获可能由非确定性原因导致的某些异常,并在最终抛出之前重试执行该代码一段时间。例外。我已经考虑过可能为此目的使用委托,但我很困惑我将如何实现这一点,而且我从未使用过 lambda 表达式,这更加令人困惑。

目标是能够将此代码重用于各种 selenium 操作。这在 Ruby 中相当简单,但在 C# 中则不然。

【问题讨论】:

  • 你试过使用委托吗?
  • 把 lambda 表达式想象成 Ruby 中的一个块。 (更准确地说,它就像 Ruby 中的 Proc 对象;Ruby 中的 a = lambda { puts "hello world" } 与 C# 中的 Action a = () => { Console.WriteLine("hello world"); } 大致相同。)
  • 很多关于这个主题的资源;看来您甚至还没有尝试过 来解决问题。有书籍、在线教程、博客、堆栈溢出问题、课程和各种其他资源。
  • 我发现这(使用函数在常见的日志记录/错误处理中包装一些 lambda)在 C# 中是一种不常见的模式。对于一个完整的 C# 新手来说,这可能并不明显——事实上,对于一些专业的 C# 开发人员来说,这并不明显...... :-\

标签: c# selenium-webdriver specflow


【解决方案1】:

对另一个答案的进一步说明:如果您需要返回值,请使用 Func 而不是 Action。

// method definition...
T ExecuteInTryCatch<T>(Func<T> block)
{
    try
    {
        return block();
    }
    catch (SomeException e)
    {
        // handle e
    }
}

// using the method...
int three = ExecuteInTryCatch(() => { return 3; })

【讨论】:

    【解决方案2】:
    void ExecuteInTryCatch(Action code)
    {
       try
       {
           code();
       }
       catch (MyException e)
       {
          do something
       }
    }
    
    ExecuteInTryCatch( ()=>{
        // stuff here
    });
    

    【讨论】:

    • 不应该是Func 而不是Action 吗? OP 表示一个可能的返回值。
    • @john 他们总是可以使用多个重载 - 但“可能的返回值”并没有真正起作用
    【解决方案3】:

    如果您想让代码返回一个值,请使用 Func

    T ExecuteInTryCatch<T>(Func<T> codeBlock)
    {
        try
        {
            codeBlock();
        }
        catch (SomeException e)
        {
            //Do Something
        }
     }
    

    否则使用 am Action

    void ExecuteInTryCatch(Action codeBlock)
    {
       try
       {
           codeBlock();
       }
       catch (MyException e)
       {
           //Do Something
       }
    }
    

    您甚至可以在未来定义自己的委托来限制传入的表达式。

    【讨论】:

      猜你喜欢
      • 2019-07-30
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多