* @param Exception|Throwable $exception
* @param array $options
* - wrap: (string|array|MessageSpecifier) Used to wrap the exception's
- * message. The exception's message will be added as the final parameter.
+ * message if it's not an ILocalizedException. The exception's message
+ * will be added as the final parameter.
* - code: (string) Default code
- * - data: (array) Extra data
- * @return ApiMessage
+ * - data: (array) Default extra data
+ * @return IApiMessage
*/
public function getMessageFromException( $exception, array $options = [] ) {
$options += [ 'code' => null, 'data' => [] ];
// Extract code and data from the exception, if applicable
if ( $exception instanceof UsageException ) {
$data = $exception->getMessageArray();
- if ( !isset( $options['code'] ) ) {
+ if ( !$options['code'] ) {
$options['code'] = $data['code'];
}
unset( $data['code'], $data['info'] );
- $options['data'] = array_merge( $data['code'], $options['data'] );
+ $options['data'] = array_merge( $data, $options['data'] );
}
if ( isset( $options['wrap'] ) ) {
} else {
$msg = new RawMessage( '$1' );
if ( !isset( $options['code'] ) ) {
- $options['code'] = 'internal_api_error_' . get_class( $exception );
+ $class = preg_replace( '#^Wikimedia\\\Rdbms\\\#', '', get_class( $exception ) );
+ $options['code'] = 'internal_api_error_' . $class;
}
}
$params = [ wfEscapeWikiText( $exception->getMessage() ) ];
if ( $tag === 'error' ) {
// In BC mode, only one error
- $value = [
- 'code' => $msg->getApiCode(),
- 'info' => $value,
- ] + $msg->getApiData();
- $this->result->addValue( null, 'error', $value,
- ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+ $existingError = $this->result->getResultData( [ 'error' ] );
+ if ( !is_array( $existingError ) ||
+ !isset( $existingError['code'] ) || !isset( $existingError['info'] )
+ ) {
+ $value = [
+ 'code' => $msg->getApiCode(),
+ 'info' => $value,
+ ] + $msg->getApiData();
+ $this->result->addValue( null, 'error', $value,
+ ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+ }
} else {
if ( $modulePath === null ) {
$moduleName = 'unknown';