Sau đây là ổn:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
Các finally
khối chạy khi toàn bộ điều đã hoàn tất thi công ( IEnumerator<T>
hỗ trợ IDisposable
để cung cấp một cách để đảm bảo điều này ngay cả khi liệt kê là bị bỏ rơi trước khi nó kết thúc).
Nhưng điều này không ổn:
try
{
Console.WriteLine("Before");
yield return 1; // error CS1626: Cannot yield a value in the body of a try block with a catch clause
Console.WriteLine("After");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Giả sử (vì lợi ích của đối số) rằng một ngoại lệ được ném bởi một hoặc một số lệnh WriteLine
gọi bên trong khối try. Vấn đề với việc tiếp tục thực thi trong catch
khối là gì?
Tất nhiên, phần trả về lợi nhuận (hiện tại) không thể ném bất cứ thứ gì, nhưng tại sao điều đó lại ngăn chúng ta có một bao vây try
/ catch
để đối phó với các ngoại lệ được ném trước hoặc sau yield return
?
Cập nhật: Có một nhận xét thú vị từ Eric Lippert ở đây - có vẻ như họ đã gặp đủ vấn đề khi triển khai hành vi try / last một cách chính xác!
CHỈNH SỬA: Trang MSDN về lỗi này là: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx . Nó không giải thích tại sao, mặc dù.