Is it a good practice to make all interface (trait) methods for which there may exist a future implementation with invalid arguments returning an option?

Let me give an example. If I would implement a library for probability distributions with a trait

```
trait Similarity {
   def getDensity(): Double
}

```

Since most distributions are not defined over the whole real space, there are always some illegal parameters e.g. a non-positive variance for a Gaussian distribution. If I understood it correctly, I should return an `Option[Double]` rather than a `Double` and throwing an `IllegalArgumentException`.

I think the same is true for most functions/calculations. What is "best practice" in this case? I am afraid this would make a library overly clumsy.

Thanks