遅延評価と例外

以下のようなメソッドから投げられる例外ってどうやったらキャッチできるのかなぁ。

public IEnumerable<int> Enumerate5()
{
  yield return 0;
  yield return 1;
  yield return 2;
  yield return 3;
  throw new Exception();
  yield return 4;
}

以下のようにしてみたけど、ダメだった。

IEnumerable<int> s = null;
try { s = Enumerate5(); }
catch (Exception e)
{
  // 例外処理...
}

foreach (int n in s)
{
  some_func(n);
}

さらに、以下のようにしてみてもダメだった。

foreach (int n in Enumerate5())
{
  try { some_func(n); }
  catch (Exception e)
  {
    // 例外処理...
  }
}

できた

ツッコミもらった。まいどありがとうございますッ!

@yagiey_tw C#全く知らないし処理系のインストールもしてないけどタイミングを考慮するとこうじゃね? try{foreach(int n in Enumerate5())some_func(n);}catch(Exception e){/*例外処理...*/}

9b96faac591ad05eddec760eed2da2d5 齊藤敦志 on Twitter: "@yagiey_tw C#全く知らないし処理系のインストールもしてないけどタイミングを考慮するとこうじゃね? try{foreach(int n in Enumerate5())some_func(n);}catch(Exception e){/*例外処理...*/}"

ってことでやってみた。

using System;
using System.Collections.Generic;
 
static class Program
{
  public static void Main(string[] args)
  {
    try
    {
      foreach(int n in Enumerate5())
      {
        Console.WriteLine(n);
      }
    }
    catch(Exception e)
    {
      Console.WriteLine("error : " + e.Message);
    }
  }
 
  public static IEnumerable<int> Enumerate5()
  {
    yield return 0;
    yield return 1;
    yield return 2;
    yield return 3;
    throw new Exception();
    yield return 4;
  }
}
http://ideone.com/Xk8TE

たしかに。foreachを丸ごとtryで囲むことを何故思いつかなかったんだろう。
...ってか、あんまり使ったこと無い言語に関して「こうすれば良いじゃね?」って言えるのすごいです。