您好我想问,因为我不确定它是否属于使用例外:
public int Method(int a, int b) {
if(a<b) throw new ArgumentException("the first argument cannot be less than the second");
//do stuff...
}
我可以在if语句后抛出异常吗?或者我应该总是使用try-catch,除非有例外吗?
答案 0 :(得分:24)
这完全有效。这正是用于检查逻辑中的“异常”的异常,这些异常并不是假设的。
捕获异常背后的想法是,当您在某处传递数据并对其进行处理时,您可能并不总是知道结果是否有效,即您想捕获的时间。
关于你的方法,你不想在Method
内部捕获,但实际上当你调用它时,这是一个例子:
try
{
var a = 10;
var b = 100;
var result = Method(a, b);
}
catch(ArgumentException ex)
{
// Report this back to the user interface in a nice way
}
在上面的例子中,a小于b,所以你可以在这里得到一个例外,你可以相应地处理它。
答案 1 :(得分:10)
在这种情况下,您不希望捕获异常。你扔掉它是为了提醒来电者他们调用你的方法时犯了错误。自己捕捉它可以防止这种情况发生。所以是的,你的代码看起来很好。
答案 2 :(得分:8)
这很好。您抛出异常,而不是捕获/处理它,因此您不需要try/catch
块。
答案 3 :(得分:6)
这完全有效,即使使用构造函数,也可以使用相同的构造。 但是不应该做什么是
public int Method(int a, int b)
{
try
{
if (a < b)
throw new ArgumentException("the first argument cannot be less than the second");
}
catch (Exception)
{
}
return 0;
}
答案 4 :(得分:3)
你有正确的想法。您可以像这样使用您的代码:
void MyMainMethod()
{
// ... oh, let's call my Method with some arguments
// I'm not sure if it'll work, so best to wrap it in a try catch
try
{
Method(-100, 500);
}
catch (ArgumentException ex)
{
Console.WriteLine(ex.Message);
}
}
public int Method(int a, int b)
{
if (a < b) throw new ArgumentException("the first argument cannot be less than the second");
//do stuff ... and return
}
查看MSDN's Handling and Throwing Exceptions和Best Practices for Handling Exceptions
可能会有所帮助答案 5 :(得分:1)
你在这里所做的完全没问题。
arg检查的一个常见模式是将check / throw代码包装在一个静态的“Contract”类中,以确保在验证输入参数时有一致的异常管理方法。
稍微偏离主题但是如果使用.NET 4.0,您还可以查看新的Code Contracts功能以验证方法输入和输出。