Handling errors

To encapsulate error handling in a maintainable way, subclass ClientUser at least once for every command you want to run and handle errors in the HandleError() method of the derived class.

To best handle the formatting of error text, parse the error text, looking for substrings of anticipated errors, and display the rest. For example:

void P4CmdFstat::HandleError(Error *e)
{
    StrBuf  m;
    e->Fmt( &m );
    if ( strstr( m.Text(), "file(s) not in client view." ) )
        e->Clear();
    else if ( strstr( m.Text(), "no such file(s)" ) )
        e->Clear();
    else if ( strstr( m.Text(), "access denied" ) )
        e->Clear();
    else
        this->e = *e;
}

Connection errors

If any error occurs when attempting to connect with the Helix Server, the ClientApi::Init() method returns an error code in its Error parameter.

Server errors

The ClientApi::Final() method returns any I/O errors that occurred during ClientApi::Run() in its Error parameter. ClientApi::Final() returns a non-zero value if any I/O errors occurred or if ClientUser::OutputError() was called (reporting server errors) during the command run.

To report errors generated by the server during an operation, your application can call the ClientUser::HandleError() method. The default implementation of HandleError() is to format the error message and call ClientUser::OutputError(), which, by default, writes the message to standard output. HandleError() has access to the raw Error object, which can be examined with the methods defined in error.h. Prior to release 99.1, Helix Server invoked OutputError() directly with formatted error text.

Find errorIds

You can find errorIds by running commands on the command line with the -e global option. This option displays more detailed information about each error or info message received, including the formatting strings, unique error codes, and severity values that are available to API users.

For more information on global options, see the Helix Core Command-Line (P4) Reference.