A Appendix: API Note - General Error Handling

The MSSelection sub-system reports errors via the C++ exception mechanism. MSSelectionError12  is the base class of the objects used to report exceptions. The class diagram for the objects thrown is shown in Fig. 2.


PIC

Figure 2: Class diagram for the objects used for error reporting via C++ exceptions in the MSSelection module.


All parsing errors are reported by throwing the MSSelection{Time, Spw, Field, UvDist, Antenna, Scan, Subarray,Poln,State}ParseError exception. All other forms of errors (e.g. illegal range (section 1.2) specification N0~N1 where N0 > N1) are reported by throwing an exception of type MSSelection{Time, Spw, Field, UvDist, Antenna, Scan, Subarray,Poln,State}Error.

Hence, to catch all errors thrown from the MSSelection sub-system, catch the MSSelectionError object. For more specific exception handling, catch the more qualified MSSelection*Error objects. For catching only parsing errors, catch the MSSelection*ParseError object. As is obvious, any un-caught exception from the MSSelection sub-system will be caught in the AipsError catch block.

The exceptional error message consists of a human understandable one-line description of the error, the string which caused the error and the possible location in the string of the erroneous character. E.g.

 Spw Expression: No match found for "LBAN" (near char. 4 in string "LBAN")

A.1 Installing Error Handlers

The normal (default) behavior of the parsers is to throw an exception when an error is encountered during parsing cycle or in the rule-resolution code. However there are cases where instead of throwing an exception, the errors must be collected as they occur and resolution of the error done at the end of the parsing cycle. In the MSSelection module, this is achieved by installing an error handler object of type MSSelectionErrorHandler13 (the base-class) in the instance of the MSSelection object. This is the object that is used internally to handle errors in the MSSelection module. The default error handler that comes pre-installed simply throws an exception of the appropriate kind when an error is encountered, recreating the normal behaviour of the C++ exception handling mechanism.

To collect errors (and the error messages generated in the process) as they occur for later resolution, the client-side code can install a specialization of the error handler of type MSSelectionLogError, a derivative of the MSSelectionErrorHandler, using the MSSelection::setErrorHandler() method, as shown in the Listing 1.

Listing 1: Code snippet showing use of external error handlers.
1      MS ms(MSNBuf,TableLock(TableLock::AutoNoReadLocking)); 
2      // 
3      // Setup the MSSelection thingi 
4      // 
5      MSSelection msSelection; 
6      MSSelectionLogError mssLE; 
7      msSelection.setErrorHandler(MSSelection::ANTENNA_EXPR,&mssLE); 
8      msSelection.reset(ms,MSSelection::PARSE_NOW, 
9                        timeStr,baselineStr,fieldStr,spwStr, 
10                        uvdistStr,taqlStr,polnStr,scanStr,arrayStr, 
11                        stateObsModeStr,observationStr);

At the appropriate place in the client code, a call to MSSelectionErrorHandler::reportError() can be made to display the collected error messages as warning messages. This behavior can be changed in a specialization of the MSSelectionErrorHandler class by overloading the reportError method.

This mechanism of error handling is currently available for ANTENNA and STATE (a.k.a. “intent selection”) selection expressions only.