メソッドの使い方が間違ってる場合(規約違反)と、予期できて回復可能かもしれないエラーは区別する。
前者はアサートを使ってもいいし例外を投げてもいいけど通常その例外をキャッチしてはいけない。
ArgumentExceptionやInvalidOperationExceptionがその例。キャッチさせるために投げてるわけじゃなく
コードを修正しろという意味なので独自の例外クラスを作る必要もない。
後者は利用側に適切に処理させるために例外を投げるので、具体的な独自の型の例外を作ったほうがよい。