Correct way to assign variables before a try/catch/finally
Two main issue I can see with your code:


app and book can potentially remain null and therefore your finally code has the potential to throw a NullReferenceException. You need to check for null first before calling methods on these objects.
The way you re-throw the exception will destroy its stacktrace. Instead of this:

catch (Exception ex)
{
    throw ex;
    //To Do...
}


you should do this:

catch (Exception ex)
{
    //To Do...
    throw;
}



As to your question where to declare books - it best practice to limit the scope of variables and declare them as close to their use point as possible.



As mentioned in the comments if you want to pass a custom error message via the exception then the best way forward it to create a custom exception which accepts the original exception as a parameter. If you derive from Exception one of the constructors accepts an inner exception parameter. So something along these lines:

public class DocumentProcessingException : Exception
{
    public DocumentProcessingException(string message, Exception innerException) :
            base(message, innerException)
    { }
}