You specify that you "handle" the error, but dont go into specifics in what implies. Also you dont specify what errors you catch or where you catch them.
When you swallow errors, you must make sure that the error dont go unnoticed. Here im not talking about the end user -its a good solution to trap the errors, and secure the user a good experience, its just not enough: you need to log the error either in the trace/ULS log, event log or some custom log so that the ones that monitor your solution can see that something went bad and act upon it. There are several logging mechanisms out there (the one included in Sharepoint Guidance is good and supports re-plugging with something else without changing too much code due to its decoupled design). In SharePoint 2010 you also have the possibility to add a correlation ID for your custom code, and custom logging/monitoring through SPDiagnosticsService and SPMonitoredScope.
Also where and what you catch is important. You shouldnt blindly catch all (System.Exception) exceptions but instead know what exceptions could happen in a given situation (know your API) and handle those that makes sense and let SharePoints own error handling take care of the rest. Again this depends on the severity of the error and how critical the application is. If its a weather web part, the user would probably rather be presented with a small error inside the web part, that something went wrong, but if its a business critical application, its our responsibility to make the user aware that the application failed.
You mention performance, and its true that there is a small performance penalty involved when doing try/catch blocks, but as long as you dont nest them (boy have i seen that, i think the record is 7 nested try catches!) and dont blindly swallow errors without doing anything:
try
{
// normal logic
}
catch // this is bad!
{}
If you do choose to swallow errors and show an error message, be sure to log it, and be sure that you do so all the places that the code could fail (basicly all public overridden methods). If you have private methods where you catch exceptions, rethrow them and let the general exception handling catch them. Here its important to not to specify a variable, or the error will be cast as such an error :
try
{
// normal logic
}
catch (ArgumentException ex) // dont specify ex!
{
throw; // this could also be an ArgumentNullException or ArgumentOutOfRangeException, but since you specified ex it is cast to ArgumentException
Finally you shouldnt use exception handling to control your program flow:
// this is bad
try
{
SPList list = web.GetList(listUrl);
}
catch ( FileNotFoundException )
{
//create list
}
If the topic interests you, I can recommend Wictor Wilén's new book on SharePoint 2010 Web Part development: SharePoint WebParts in Action. Chapter 8 covers the topic of troubleshooting web parts in detail.