blob: 1694ac9660e2aec55c4357597e5854f964c11a08 [file] [log] [blame]
// Copyright 2015 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.lib.concurrent;
import com.google.common.base.Preconditions;
/** A classifier for {@link Error}s and {@link Exception}s. Used by {@link AbstractQueueVisitor}. */
public abstract class ErrorClassifier {
/**
* Classification of an error thrown by an action.
*
* <p>N.B. - These enum values are ordered from least severe to most severe.
*/
public enum ErrorClassification {
/** Other running actions should be left alone.*/
NOT_CRITICAL,
/** All running actions should be stopped.*/
CRITICAL,
/** Same as {@link #CRITICAL}, but also log the error.*/
CRITICAL_AND_LOG,
/** Same as {@link #CRITICAL_AND_LOG}, but is even worse. */
AS_CRITICAL_AS_POSSIBLE
}
/** Always treat exceptions as {@code NOT_CRITICAL}. */
public static final ErrorClassifier DEFAULT =
new ErrorClassifier() {
@Override
protected ErrorClassification classifyException(Exception e) {
return ErrorClassification.NOT_CRITICAL;
}
};
/**
* Used by {@link #classify} to classify {@link Exception}s. (Note that {@link Error}s
* are always classified as {@code AS_CRITICAL_AS_POSSIBLE}.)
*
* @param e the exception object to check
*/
protected abstract ErrorClassification classifyException(Exception e);
/**
* Classify {@code e}. If {@code e} is an {@link Error}, it will be classified as
* {@code AS_CRITICAL_AS_POSSIBLE}. Otherwise, calls {@link #classifyException}.
*/
public final ErrorClassification classify(Throwable e) {
if (e instanceof Error) {
return ErrorClassification.AS_CRITICAL_AS_POSSIBLE;
}
Preconditions.checkArgument(e instanceof Exception, e);
return classifyException((Exception) e);
}
}