Let\'s assume we have a method handling operations in a tree hierarchical data structure located in a class handling such a structure.
Let\'s look closer at one of t
Since the exception being thrown indicates a bug here, and it thus won't be ever thrown in a correctly working program and exception is the right choice.
What you should not do is:
try
{
MoveNode(...)
//Do something
}
catch(ArgumentException e)
{
//Do something else
}
In that example you expect the exception being thrown regularly and use it to control the control flow. Catching an ArgumentException in the caller is almost always a bad idea. This kind of exception should only be caught in the top-level handler, if at all.
Personally I don't like you throwing the exception in the else clause. I prefer doing my parameter checking at the beginning of the function and throw the exception immediately afterwards. That prevents nesting the non error code within multiple if blocks.
There are three types of exceptions
Eric Lippert talk about these kinds of exception in a blog entry: Vexing exceptions
When to use the third kind of exception, and when to use return values is a judgment call.