Catch块不会捕获异常

时间:2012-05-30 14:09:44

标签: c# asp.net-mvc-3

如果在服务器上找到图像,我有一个应该返回图像的操作。如果filename有效,则一切都按预期工作。但是如果找不到该文件,它总是抛出一个未处理的异常:

  

在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。

为什么catch块不处理这个异常?

这是我的简化代码:

public ActionResult Users(string filename)
    {
        try
        {
            var filePath = Server.MapPath("~/App_Data/uploads/users/" + filename);
            var file = File(filePath, "image/jpg", Path.GetFileName(filePath));
            return file;
        }
        catch
        {
            return Content("FILE NOT FOUND");
        }
    }

修改

错误:

  

找不到文件'C:\ Projects \ Extranet \ App_Data \ uploads \ users \ test123.png'。

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.IO.FileNotFoundException:找不到   文件'C:\ Projects \ Extranet \ App_Data \ uploads \ users \ test123.png'。

     

来源错误:

     

执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[FileNotFoundException: Could not find file 'C:\Projects\Extranet\App_Data\uploads\users\test123.png'.]
   System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +9726591
   System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath) +1142
   System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) +83
   System.Web.HttpResponse.TransmitFile(String filename, Int64 offset, Int64 length) +132
   System.Web.HttpResponseWrapper.TransmitFile(String filename) +20
   System.Web.Mvc.FilePathResult.WriteFile(HttpResponseBase response) +17
   System.Web.Mvc.FileResult.ExecuteResult(ControllerContext context) +188
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
   System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +23
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +260
   System.Web.Mvc.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +177
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343
   System.Web.Mvc.Controller.ExecuteCore() +116
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
   System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50
   System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8967885
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

1 个答案:

答案 0 :(得分:3)

您尝试检索的文件不存在,因此当MVC处理您的ActionResult时会出现IOException。

这发生在您的控制器方法之外,因此在try-catch块之外。请尝试使用以下代码:

public ActionResult Users(string filename)
{
    var filePath = Server.MapPath("~/App_Data/uploads/users/" + filename);
    return File.Exists( filePath ) ? File(filePath, "image/jpg", Path.GetFileName(filePath)) : Content( "FILE NOT FOUND" );
}