<p>Which one should I use?</p>

<pre><code>catch (_com_error e)  
</code></pre>

<p>or  </p>

<pre><code>catch (_com_error&amp; e)
</code></pre>

The second.  Here is my attempt at quoting Sutter
"Throw by value, catch by reference"
Learn to
```
catch
```
properly: Throw exceptions by value (not pointer) and
  catch them by reference (usually to
```
const
```
). This is the combination
  that meshes best with exception semantics. When rethrowing the same
  exception, prefer just
```
throw;
```
to
```
throw e;
```
.
Here's the full
Item 73. Throw by value, catch by reference.
The reason to avoid catching exceptions by value is that it implicitly makes a copy of the exception. If the exception is of a subclass, then information about it will be lost.
```
```
try { throw MyException ("error") } 
catch (Exception e) {
    /* Implies: Exception e (MyException ("error")) */
    /* e is an instance of Exception, but not MyException */
}
```
```
Catching by reference avoids this issue by not copying the exception.
```
```
try { throw MyException ("error") } 
catch (Exception& e) {
    /* Implies: Exception &e = MyException ("error"); */
    /* e is an instance of MyException */
}
```
```