The analyzer detected that the original object of a caught exception was not used properly when re-throwing from a catch block. This issue makes some errors hard to detect since the stack of the original exception is lost.
Further we will discuss a couple of examples of incorrect code. The first example:
public Asn1Object ToAsn1Object() { try { return Foo(_constructed, _tagNumber); } catch (IOException e) { throw new ParsingException(e.Message); } }
In this code, the programmer wanted to transform the caught I/O exception into a new exception of type 'ParsingException'. However, only the message from the first exception is included, so some of the information is lost.
The fixed version of the code:
public Asn1Object ToAsn1Object() { try { return Foo(_constructed, _tagNumber); } catch (IOException e) { throw new ParsingException(e.Message, e); } }
In the fixed version, the original exception is re-thrown as an inner one, so all the information about the original error is saved.
Here's the second example:
private int ReadClearText(byte[] buffer, int offset, int count) { int pos = offset; try { .... } catch (IOException ioe) { if (pos == offset) throw ioe; } return pos - offset; }
In this case, the caught I/O exception is thrown again, completely erasing the stack of the original error. To avoid this defect, we just need to re-throw the original exception.
The fixed version of the code:
private int ReadClearText(byte[] buffer, int offset, int count) { int pos = offset; try { .... } catch (IOException ioe) { if (pos == offset) throw; } return pos - offset; }
This diagnostic is classified as:
You can look at examples of errors detected by the V3052 diagnostic. |