此内容适合 v2.8.3 之后

---

<mark>http 404 输出的本质是：请求没有对应的处理，框架在最后做了自动转换的结果</mark>。http 500 则是，异常没有对应的处理，框架在最后做了自动转换的结果（道理差不多）。


**理解这个本质很重要**。所有，有两种方式可以处理 404 的情况：

### 1、在 404 状态转换之前

这个时候的特征是，没有主处理（或没有被处理）。但，还没有产生 404 状态。比如在 RouterInterceptor 里：

```java
import org.noear.solon.annotation.Component;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.Handler;
import org.noear.solon.core.route.RouterInterceptor;
import org.noear.solon.core.route.RouterInterceptorChain;

@Component
public class DemoRouterInterceptor implements RouterInterceptor {
    @Override
    public void doIntercept(Context ctx, Handler mainHandler, RouterInterceptorChain chain) throws Throwable {
        //此时：当 mainHandler == null 时，就是没有主处理。
        if(mainHandler == null){
            //如果不需要再继承，就可以当 404 处理并返回了
            ctx.redirect("/404.htm");
            ctx.setHandled(true); //为了不被过滤器，误会。标为已处理
            return;
        }
        
        chain.doIntercept(ctx,mainHandler);
    }
}
```

再比如在过滤器里：

```java
import org.noear.solon.annotation.Component;
import org.noear.solon.core.exception.StatusException;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.Filter;
import org.noear.solon.core.handle.FilterChain;

@Component
public class DemoFilter implements Filter {

    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        try {
            chain.doFilter(ctx);
        } catch (StatusException e){
            if (e.getCode() == 404) {
                //如果不需要再继承，就可以当 404 处理并返回了
                ctx.redirect("/404.htm");
                return;
            }
        }
    }
}
```

也可以参考 [《统一的异常处理》](/article/765) 的第二节，404 也可以当作一种异常，一并处理。



### 2、在 404 状态转换之后，添加 404 状态处理

如果你什么都没做，框架在最外层的处理会把它转为 404 状态。此时，可以借助全局的状态管理，添加状态处理：

```java
import org.noear.solon.Solon;

public class App {
    public static void main(String[] args) {
        Solon.start(App.class, args, app->{
            app.onStatus(404, ctx->{
                ctx.output("hi 404!");
            });
        });
    }
}
```

