Khối trên đề cập đến một câu hỏi + câu trả lời khác về SO KHÔNG chứa câu trả lời đúng áp dụng ở đây!Có phải ngoại lệ chung được hỗ trợ bên trong bẫy không?
Tôi có phương pháp được sử dụng để kiểm tra đơn vị. Mục đích của phương pháp này là để đảm bảo rằng một đoạn mã (được tham chiếu bởi một đại biểu) sẽ ném một ngoại lệ cụ thể. Nếu ngoại lệ đó được ném, kiểm tra đơn vị thành công. Nếu không có ngoại lệ được ném hoặc loại ngoại lệ khác được ném, kiểm tra đơn vị sẽ thất bại.
/// <summary>
/// Checks to make sure that the action throws a exception of type TException.
/// </summary>
/// <typeparam name="TException">The type of exception expected.</typeparam>
/// <param name="action">The code to execute which is expected to generate the exception.</param>
public static void Throws<TException>(Action action)
where TException : Exception
{
try
{
action();
}
catch (TException)
{
return;
}
catch (Exception ex)
{
Assert.Fail("Wrong exception was thrown. Exception of type " + ex.GetType() + " was thrown, exception of type " + typeof(TException) + " was expected.");
}
Assert.Fail("No exception was thrown. Exception of type " + typeof(TException) + " was expected.");
}
Các cuộc gọi tiếp theo nên thành công, nhưng nó không thành công:
int result = 0;
Throws<DivideByZeroException>(() => result = result/result);
Khi ngoại lệ dự kiến của loại TException
được ném, nó luôn luôn bị bắt bởi đánh bắt thứ hai, không phải do bắt đầu. Tại sao điều này?
Tất nhiên tôi có thể sử dụng một workarround với một bắt và kiểm tra nếu ex
là loại TException
. Bởi tôi chỉ đơn giản muốn biết/hiểu tại sao mã này biên dịch nhưng công việc đơn giản (không bao giờ?).
EDIT
Theo yêu cầu của một "làm việc" demo:
using System;
namespace GenericExceptionDemo
{
class Program
{
static void Main(string[] args)
{
int n = 0;
Catch<DivideByZeroException>(() => n = n/n);
}
static public void Catch<TException>(Action action)
where TException: Exception
{
try
{
action();
Console.WriteLine("No exception thrown. !!!Fail!!!");
}
catch (TException)
{
Console.WriteLine("Expected exception thrown. PASS!");
}
catch(Exception ex)
{
Console.WriteLine("An unexpected exception of type " + ex.GetType() + " thrown. !!!FAIL!!!");
}
}
}
}
Bạn đang sử dụng khung kiểm tra đơn vị nào? Hầu hết đã có 'Assert.Throws' ... –
Mã của bạn hoạt động cho tôi ... vui lòng hiển thị một chương trình ngắn nhưng đầy đủ để minh họa sự cố. –
Tại sao nói rằng một loại ngoại lệ sai được ném? Có thể .Net framework tự ném cho bạn một System.Drawing.Exception khi bạn đang làm việc với GUI? –