On 8/30/05, Joe Van Dyk <joevandyk / gmail.com> wrote:
> On 8/30/05, Joe Van Dyk <joevandyk / gmail.com> wrote:
> > Hi,
> >
> > When should you define your own exceptions?  Any rules of thumb?
> >
> > I'm writing an application that runs on a computer and listens for
> > requests to start, kill, and view log files for other applications on
> > that computer.  Say I get a request to start an application on that
> > computer and the requested executable doesn't exist.  Should I throw a
> > custom exception then?  Or, say an application dies unexpectedly.
> > What should I use for an exception then?
> 
> The start function follows:
> 
> class Application
> ...
>   def start
>     raise "No executable given!" if not @executable
>     if @pid = fork
>       Process.detach @pid
>       @status = :running
>     else
>       @options.each do |option_name, option_value|
>         ENV[option_name] = option_value
>       end
>       args = @arguments.join " "
>       exec "#{ basedir }/#{ version }/#{ executable } #{ args }"
>     end
>   end
> ...
> end
> 
> So, if there's no valid executable, then the exec call will fail.
> What's the best way of transmitting that information to the rest of
> the system?

Eeek.  So, I was trying to do a test like:

  def test_start_bad_application
    a = Application.new invalid_application_executable
    assert_raise(RuntimeError) { a.start }
    assert !a.running?
    assert_equal :failed, a.status
  end

But since it forks into a new process, I don't catch the exception.  I
could check to see if the executable exists (and is executable) before
going into the fork, and if it's not valid, throw an exception.  Is
that my best bet?