- Patch #329015 by Damien Tournoud: improved error handling of batch API.
							parent
							
								
									cdb326fc74
								
							
						
					
					
						commit
						ac5e86e05c
					
				| 
						 | 
					@ -9,6 +9,21 @@
 | 
				
			||||||
 * a cached page are instead located in bootstrap.inc.
 | 
					 * a cached page are instead located in bootstrap.inc.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Error reporting level: display no errors.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					define('ERROR_REPORTING_HIDE', 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Error reporting level: display errors and warnings.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					define('ERROR_REPORTING_DISPLAY_SOME', 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Error reporting level: display all messages.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					define('ERROR_REPORTING_DISPLAY_ALL', 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Return status for saving which involved creating a new item.
 | 
					 * Return status for saving which involved creating a new item.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					@ -754,7 +769,7 @@ function _drupal_decode_exception($exception) {
 | 
				
			||||||
 *   TRUE if the error is fatal.
 | 
					 *   TRUE if the error is fatal.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
function _drupal_log_error($error, $fatal = FALSE) {
 | 
					function _drupal_log_error($error, $fatal = FALSE) {
 | 
				
			||||||
  // Initialize a maintenance theme early if the boostrap was not complete.
 | 
					  // Initialize a maintenance theme if the boostrap was not complete.
 | 
				
			||||||
  // Do it early because drupal_set_message() triggers an init_theme().
 | 
					  // Do it early because drupal_set_message() triggers an init_theme().
 | 
				
			||||||
  if ($fatal && (drupal_get_bootstrap_phase() != DRUPAL_BOOTSTRAP_FULL)) {
 | 
					  if ($fatal && (drupal_get_bootstrap_phase() != DRUPAL_BOOTSTRAP_FULL)) {
 | 
				
			||||||
    unset($GLOBALS['theme']);
 | 
					    unset($GLOBALS['theme']);
 | 
				
			||||||
| 
						 | 
					@ -781,34 +796,41 @@ function _drupal_log_error($error, $fatal = FALSE) {
 | 
				
			||||||
    $number++;
 | 
					    $number++;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Force display of error messages in update.php or if the proper error
 | 
					 | 
				
			||||||
  // reporting level is set.
 | 
					 | 
				
			||||||
  $error_level = variable_get('error_level', 2);
 | 
					 | 
				
			||||||
  if ($error_level == 2 || ($error_level == 1 && $error['%type'] != 'Notice') || (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'update')) {
 | 
					 | 
				
			||||||
    drupal_set_message(t('%type: %message in %function (line %line of %file).', $error), 'error');
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    watchdog('php', '%type: %message in %function (line %line of %file).', $error, WATCHDOG_ERROR);
 | 
					    watchdog('php', '%type: %message in %function (line %line of %file).', $error, WATCHDOG_ERROR);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  catch (Exception $e) {
 | 
					  catch (Exception $e) {
 | 
				
			||||||
    $new_error = _drupal_decode_exception($e);
 | 
					    // Ignore any additional watchdog exception, as that probably means
 | 
				
			||||||
    drupal_set_message(t('%type: %message in %function (line %line of %file).', $new_error), 'error');
 | 
					    // that the database was not initialized correctly.
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ($fatal) {
 | 
					  if ($fatal) {
 | 
				
			||||||
    drupal_set_header('503 Service unavailable');
 | 
					    drupal_set_header($_SERVER['SERVER_PROTOCOL'] . ' 500 Service unavailable (with message)');
 | 
				
			||||||
    drupal_set_title(t('Error'));
 | 
					  }
 | 
				
			||||||
    if (!defined('MAINTENANCE_MODE') && drupal_get_bootstrap_phase() == DRUPAL_BOOTSTRAP_FULL) {
 | 
					
 | 
				
			||||||
      // To conserve CPU and bandwidth, omit the blocks.
 | 
					  if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
 | 
				
			||||||
      $page = drupal_get_page(t('The website encountered an unexpected error. Please try again later.'));
 | 
					    if ($fatal) {
 | 
				
			||||||
      $page['#show_blocks'] = FALSE;
 | 
					      // When called from JavaScript, simply output the error message.
 | 
				
			||||||
      print drupal_render_page($page);
 | 
					      print t('%type: %message in %function (line %line of %file).', $error);
 | 
				
			||||||
 | 
					      exit;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					  }
 | 
				
			||||||
 | 
					  else {
 | 
				
			||||||
 | 
					    // Display the message if the current error reporting level allows this type
 | 
				
			||||||
 | 
					    // of message to be displayed, and unconditionnaly in update.php.
 | 
				
			||||||
 | 
					    $error_level = variable_get('error_level', ERROR_REPORTING_DISPLAY_ALL);
 | 
				
			||||||
 | 
					    $display_error = $error_level == ERROR_REPORTING_DISPLAY_ALL || ($error_level == ERROR_REPORTING_DISPLAY_SOME && $error['%type'] != 'Notice');
 | 
				
			||||||
 | 
					    if ($display_error || (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'update')) {
 | 
				
			||||||
 | 
					      drupal_set_message(t('%type: %message in %function (line %line of %file).', $error), 'error');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ($fatal) {
 | 
				
			||||||
 | 
					      drupal_set_title(t('Error'));
 | 
				
			||||||
 | 
					      // We fallback to a maintenance page at this point, because the page generation
 | 
				
			||||||
 | 
					      // itself can generate errors.
 | 
				
			||||||
      print theme('maintenance_page', t('The website encountered an unexpected error. Please try again later.'), FALSE);
 | 
					      print theme('maintenance_page', t('The website encountered an unexpected error. Please try again later.'), FALSE);
 | 
				
			||||||
 | 
					      exit;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    exit;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -296,16 +296,16 @@ Drupal.getSelection = function (element) {
 | 
				
			||||||
 * Build an error message from ahah response.
 | 
					 * Build an error message from ahah response.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
Drupal.ahahError = function (xmlhttp, uri) {
 | 
					Drupal.ahahError = function (xmlhttp, uri) {
 | 
				
			||||||
  if (xmlhttp.status == 200) {
 | 
					  if (xmlhttp.status == 200 || (xmlhttp.status == 500 && xmlhttp.statusText == 'Service unavailable (with message)')) {
 | 
				
			||||||
    if ($.trim(xmlhttp.responseText)) {
 | 
					    if ($.trim(xmlhttp.responseText)) {
 | 
				
			||||||
      var message = Drupal.t('An error occurred. \n@uri\n@text', { '@uri': uri, '@text': xmlhttp.responseText });
 | 
					      var message = Drupal.t("An error occurred. \nPath: @uri\nMessage: !text", { '@uri': uri, '!text': xmlhttp.responseText });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
      var message = Drupal.t('An error occurred. \n@uri\n(no information available).', { '@uri': uri });
 | 
					      var message = Drupal.t("An error occurred. \nPath: @uri\n(no information available).", {'@uri': uri });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else {
 | 
					  else {
 | 
				
			||||||
    var message = Drupal.t('An HTTP error @status occurred. \n@uri', { '@uri': uri, '@status': xmlhttp.status });
 | 
					    var message = Drupal.t("An HTTP error @status occurred. \nPath: @uri", { '@uri': uri, '@status': xmlhttp.status });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return message.replace(/\n/g, '<br />');
 | 
					  return message.replace(/\n/g, '<br />');
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -672,21 +672,21 @@ class DrupalErrorHandlerUnitTest extends DrupalWebTestCase {
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Set error reporting to collect notices.
 | 
					    // Set error reporting to collect notices.
 | 
				
			||||||
    variable_set('error_level', 2);
 | 
					    variable_set('error_level', ERROR_REPORTING_DISPLAY_ALL);
 | 
				
			||||||
    $this->drupalGet('system-test/generate-warnings');
 | 
					    $this->drupalGet('system-test/generate-warnings');
 | 
				
			||||||
    $this->assertErrorMessage($error_notice);
 | 
					    $this->assertErrorMessage($error_notice);
 | 
				
			||||||
    $this->assertErrorMessage($error_warning);
 | 
					    $this->assertErrorMessage($error_warning);
 | 
				
			||||||
    $this->assertErrorMessage($error_user_notice);
 | 
					    $this->assertErrorMessage($error_user_notice);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Set error reporting to not collect notices.
 | 
					    // Set error reporting to not collect notices.
 | 
				
			||||||
    variable_set('error_level', 1);
 | 
					    variable_set('error_level', ERROR_REPORTING_DISPLAY_SOME);
 | 
				
			||||||
    $this->drupalGet('system-test/generate-warnings');
 | 
					    $this->drupalGet('system-test/generate-warnings');
 | 
				
			||||||
    $this->assertNoErrorMessage($error_notice);
 | 
					    $this->assertNoErrorMessage($error_notice);
 | 
				
			||||||
    $this->assertErrorMessage($error_warning);
 | 
					    $this->assertErrorMessage($error_warning);
 | 
				
			||||||
    $this->assertErrorMessage($error_user_notice);
 | 
					    $this->assertErrorMessage($error_user_notice);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Set error reporting to not show any errors.
 | 
					    // Set error reporting to not show any errors.
 | 
				
			||||||
    variable_set('error_level', 0);
 | 
					    variable_set('error_level', ERROR_REPORTING_HIDE);
 | 
				
			||||||
    $this->drupalGet('system-test/generate-warnings');
 | 
					    $this->drupalGet('system-test/generate-warnings');
 | 
				
			||||||
    $this->assertNoErrorMessage($error_notice);
 | 
					    $this->assertNoErrorMessage($error_notice);
 | 
				
			||||||
    $this->assertNoErrorMessage($error_warning);
 | 
					    $this->assertNoErrorMessage($error_warning);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1268,11 +1268,11 @@ function system_logging_settings() {
 | 
				
			||||||
  $form['error_level'] = array(
 | 
					  $form['error_level'] = array(
 | 
				
			||||||
    '#type' => 'radios',
 | 
					    '#type' => 'radios',
 | 
				
			||||||
    '#title' => t('Display PHP messages'),
 | 
					    '#title' => t('Display PHP messages'),
 | 
				
			||||||
    '#default_value' => 2,
 | 
					    '#default_value' => ERROR_REPORTING_DISPLAY_ALL,
 | 
				
			||||||
    '#options' => array(
 | 
					    '#options' => array(
 | 
				
			||||||
      0 => t('None'),
 | 
					      ERROR_REPORTING_HIDE => t('None'),
 | 
				
			||||||
      1 => t('Errors and warnings'),
 | 
					      ERROR_REPORTING_DISPLAY_SOME => t('Errors and warnings'),
 | 
				
			||||||
      2 => t('All messages'),
 | 
					      ERROR_REPORTING_DISPLAY_ALL => t('All messages'),
 | 
				
			||||||
    ),
 | 
					    ),
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue