Which one should I use?
catch (_com_error e)
or
catch (_com_error& e)
Personally, I would go for the third option:
catch (const _com_error& e)