There is not really any one correct way to implement exception handling, but we know there are many bad ways to do it. In a multi-tiered environment, allowing an exception to propagate makes sense. .NET allows you to create custom exceptions, but you have to be careful about versioning. Exceptions are also expensive, so it is best to avoid as many as possible.
The Code Project has a nice little article about handling exceptions at http://codeproject.com/csharp/exceptions.asp?print=true