C #: Lançando práticas recomendadas de exceção personalizada

Li algumas das outras perguntas sobre práticas de manipulação de exceções em C #, mas nenhuma parece perguntar o que estou procurando.

Se eu implementar minha própria exceção personalizada para uma classe ou conjunto de classes específico. Todos os erros relacionados a essas classes devem ser encapsulados em minha exceção usando exceção interna ou devo deixá-los cair?

Eu estava pensando que seria melhor capturar todas as exceções para que a exceção pudesse ser reconhecida imediatamente da minha fonte. Ainda estou passando a exceção original como uma exceção interna. Por outro lado, eu estava pensando que seria redundante refazer a exceção.

Exceção:

class FooException : Exception
{
    //...
}

Opção 1: Foo encerra todas as exceções:

class Foo
{
    DoSomething(int param)
    {
        try 
        {
             if (/*Something Bad*/)
             {  
                 //violates business logic etc... 
                 throw new FooException("Reason...");
             }
             //... 
             //something that might throw an exception
        }
        catch (FooException ex)
        {
             throw;
        }
        catch (Exception ex)
        {
             throw new FooException("Inner Exception", ex);
        }
    }
}

Opção 2: Foo lança FooExceptions específicas, mas permite que outras exceções se abram:

class Foo
{
    DoSomething(int param)
    {
        if  (/*Something Bad*/)
        {
             //violates business logic etc... 
             throw new FooException("Reason...");
        }
        //... 
        //something that might throw an exception and not caught
    }
}

questionAnswers(8)

yourAnswerToTheQuestion