To address the part of your question about what exceptions you should catch, have a look at this article: [How to Design Exception Hierarchies][1] Despite the title, it's very useful in understanding the different types of exceptions. There are three types, and they should be handled in three different ways: * **Usage error**. This is due to an error in coding - **fix your code**. * **Logical error**. An unavoidable condition, such as file not found - **handle the exception**. * **System failure**. A system error such as out of memory - **shut down the program**. (File not found is unavoidable because even if you call File.Exists(), it's possible someone could delete the file *just* before you access it. So to really be correct, you still need to handle it.) The only case where you definitely need try/catch blocks is for logical errors. In those cases, you can't guarantee avoiding the exception, so you need to handle it. [1]: http://blogs.msdn.com/b/kcwalina/archive/2007/01/30/exceptionhierarchies.aspx