# 命名例外

> 原文： [https://docs.oracle.com/javase/tutorial/jndi/ops/exception.html](https://docs.oracle.com/javase/tutorial/jndi/ops/exception.html)

当 JNDI 包中的许多方法需要指示无法执行所请求的操作时，它会抛出 [`NamingException`](https://docs.oracle.com/javase/8/docs/api/javax/naming/NamingException.html)。通常，你会看到 `try / catch` 包装器可以抛出 `NamingException` ：

```
try {
    Context ctx = new InitialContext();
    Object obj = ctx.lookup("somename");
} catch (NamingException e) {
    // Handle the error
    System.err.println(e);
}

```

## 异常类层次结构

JNDI 具有源自 `NamingException` 类的丰富异常层次结构。异常的类名是不言自明的，在此处列出 [](https://docs.oracle.com/javase/8/docs/api/javax/naming/package-tree.html) 。

要特别处理 `NamingException` 的特定子类，可以单独捕获子类。例如，以下代码专门处理 `AuthenticationException` 及其子类。

```
try {
    Context ctx = new InitialContext();
    Object obj = ctx.lookup("somename");
} catch (AuthenticationException e) {
    // attempt to reacquire the authentication information
    ...
} catch (NamingException e) {
    // Handle the error
    System.err.println(e);
}

```

## 枚举

诸如 [`Context.list（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/Context.html#list-javax.naming.Name-) 和 [`DirContext.search（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/DirContext.html#search-javax.naming.Name-java.lang.String-javax.naming.directory.SearchControls-) 等操作返回 [`NamingEnumeration`](https://docs.oracle.com/javase/8/docs/api/javax/naming/NamingEnumeration.html)。在这些情况下，如果发生错误并且没有返回结果，则在调用方法时将抛出 `NamingException` 或其中一个适当的子类。如果发生错误但有一些结果要返回，则会返回 `NamingEnumeration` ，以便您可以获得这些结果。当所有结果都用尽时，调用 [`NamingEnumeration.hasMore（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/NamingEnumeration.html#hasMore--) 将导致 `NamingException` （或其子类之一）被抛出以指示错误。此时，枚举变为无效，并且不应再对其调用任何方法。

例如，如果执行`搜索（）`并指定要返回多少个答案的计数限制（ _n_ ），则`搜索（）`将返回最多由 _n_ 组成的枚举结果。如果结果数超过 _n_ ，则当 `NamingEnumeration.hasMore（）`被调用 _n + 1_ 时， `SizeLimitExceededException` 将被抛出。有关示例代码，请参阅本课程的[结果计数](countlimit.html)。

## 本教程中的示例

在本教程文本中嵌入的内联示例代码中，为了便于阅读，通常省略 `try / catch` 子句。通常，因为这里仅示出了代码片段，所以仅包括在说明概念中直接有用的行。如果查看本教程附带的源文件，您将看到`尝试/捕获`子句对 `NamingException` 的适当放置。

javax.naming 包中的异常可以在[中找到](https://docs.oracle.com/javase/8/docs/api/javax/naming/package-summary.html)。