2014-04-16 9 views
5

Dowiedziałem się, że wyjątki generowane przez mój kod w mojej aplikacji sieci web ASP.NET 3.5, wydają się być obsługiwane inaczej przez ASP .NET niż te wyrzucane przez kod frameworka. Pozwól mi zilustrować:Dlaczego ASP.NET pozornie obsługuje wyjątki wyrzucane przez framework i aplikację internetową w inny sposób?

ten wyjątek:

//some code 
throw new Exception("Something bad happened."); 

nie wydaje się, aby wyzwolić obsługi Application_Error w mojej klasie global.asax i wyników na stronie błędu asp.net wykonawczego z komunikatem wyjątku i ślad stosu mimo kompilacji debug = "false" i customErrors mode = "On" defaultRedirect = ... ustawienia w web.config! Natomiast:

//some code 
//throw new Exception("Something bad happened."); 
object test = null; 
test.ToString(); 

powoduje, że odpowiedź jest przekierowywana na właściwą stronę błędu aplikacji. Czy to zachowanie jest zgodne z projektem, czy też są tu inne rzeczy, których nie rozumiem?

+2

To nie powinno się dziać. Czy możesz opublikować zawartość obsługi zdarzenia Application_Error? –

Odpowiedz

2

To nie powinno się zdarzyć. throw new Exception("Something bad happened.") uruchamia globalny program obsługi wyjątku w taki sam sposób, jak robi to ((string)null).ToString().

1) Upewnij się, że jesteś obsługi zdarzeń w Global.asax.cs oświadczył poprawnie

public class Global : System.Web.HttpApplication { 
    protected void Application_Error(object sender, EventArgs e) { 
    // handle exception here 
    } 
} 

2) wyjątki wyrzuceniu z nowego wątku lub z metod usługi (.asmx, .svc) nie przyłapania przez Application_Error

[ServiceContract] 
public interface IService { 
    [OperationContract] 
    void DoWork(); 
} 

public class Service : IService { 
    public void DoWork() { 
     throw new Exception("No Application_Error for me, please."); 
    } 
} 

protected void Page_Load(object sender, EventArgs e) { 
    new Thread(() => { 
    throw new Exception("No Application_Error for me, either."); 
    }).Start(); 
} 

3) istnieją dwa wyjątki bad-ass StackOverflowException i OutOfMemoryException, te rzeczywiście są traktowane inaczej, gdy rzucisz je w kodzie jak

throw new StackOverflowException();  
throw new OutOfMemoryException(); 

handler Application_Error jest wezwanych, ale gdy występują one „for real” oni również zaburzyć stan domeny i obsługi nie jest nazywany w tych przypadkach (bo zamknięty pulę aplikacji, jak również).

protected void Page_Load(object sender, EventArgs e) { 
    // enjoy stack overflow in a little while 
    this.Page_Load(sender, e); 
} 
Powiązane problemy