Creating your custom exception classes is the perfect way to achieve adequate classification of different exceptional situations. You can provide exception information in the form of a set of properties specific to each type of exceptional situation to comprehensively describe a situation.
Also, note that the search for best exception may sometimes give you the required solution but would be pointless in a general case. That is why: no matter what available external or platform API libraries you use, the exception classes defined there are always more abstract and agnostic to the application system you develop. Therefore, you may need your own exception classes, more semantically aware of your specific application field.