在处理测试方法时,我偶然发现了一个奇怪的异常问题。基本上,我在if语句中抛出一个异常,它不会被它上面的try-catch捕获。所有这些似乎都与GalaSoft.MvvmLight.Command.RelayCommand和之后的行有关。以下是一些代码片段,如果你们想重现这个问题: 这是我的测试方法
[TestMethod]
public void TestRelayCommand()
{
TestEditVM t = new TestEditVM();
bool argumentNullExceptionCatched = false;
try
{
t.lists.Add(new MyObject());
t.MyCommand.Execute(null);
//t.MethodToTest();
}
catch (ArgumentNullException)
{
argumentNullExceptionCatched = true;
}
Assert.IsTrue(argumentNullExceptionCatched);
}
这是我的TestEditVM及其使用的小类
class TestEditVM
{
public ObservableCollection<MyObject> lists = new ObservableCollection<MyObject>();
public void MethodToTest()
{
int i = 0;
int j = 1;
int k = 1;
i++;
//throw new ArgumentNullException();
if (j == k)
throw new ArgumentNullException("lorem", "ipsum");
i++;
//throw new ArgumentNullException();
var lvm = (lists.FirstOrDefault(l => l.IsQueryOwner(null)));
}
private RelayCommand _myCommand;
public RelayCommand MyCommand
{
get
{
if (_myCommand == null)
{
_myCommand = new RelayCommand(() =>
{
int i = 0;
int j = 1;
int k = 1;
i++;
//throw new ArgumentNullException();
if (j == k)
throw new ArgumentNullException("lorem", "ipsum");
i++;
//throw new ArgumentNullException();
var lvm = (lists.FirstOrDefault(l => l.IsQueryOwner(null)));
}
);
}
return _myCommand;
}
}
}
class MyObject
{
public int Id { get; set; }
public MyObject Query { get; set; }
public bool IsQueryOwner(MyObject query)
{
if (query == null)
throw new Exception("MyObject exception");
return Query.Id == query.Id;
}
}
如果我注释掉LinQ行,则抛出异常并按预期捕获。运行Inside TestMethod1()的相同代码始终表现正常。
另外,我注意到如果其中一个&#34;抛出&#34;语句是未注释的,代码按预期运行并捕获异常。我相信这是编译器在执行过程中不包含无法访问的代码所做的一些工作(即伪造的linq行)
我在Visual Studio 2013上运行此测试项目,在.net Framework 4.5上,NuGet上提供了最新的mvvm light Framework。
非常感谢任何帮助或解释! 谢谢!