I think this kind of exception is perfect to throw when expected the type of parameter, value etc. is good, but its value is out of domain. Look at RangeException:>>Exception thrown to indicate range errors during program execution. Normally this means there was an arithmetic error other than under/overflow. This is the runtime version of DomainException.<<So, this kind of exception is designed for logic errorWhen datatype is wrong, the better way is throwing InvalidArgumentException. <?phpfunction media($x) { switch ($x) { case image: return 'PNG'; break; case video: return 'MP4'; break; default: throw new InvalidArgumentException ("Invalid media type!"); }}?>This is completly diffirent situation than this:<?php$object = new Library ();try { $object->allocate($x);} catch (toFewMin $e) { throw new DomainException ("Minimal value to allocate is too high").}?>The simillar situation, but problem occurs during runtime:<?phpclass library { function allocate($x) { if ($x<1000) throw new RangeException ("Value is too low!") }}?>Summary: DomainException corresponds to RangeException and we should use them in simillar situations. But first exception is designed to use when we are sure the problem is with our project, third-part elements etc. (simply: logical error), the second way is designed to use when we are sure the problem is with input data or environment (simply: runtime error).