Prázdný Exception.StackTrace

MyEgo.cz

home foto blogy mywindows.cz kontakt

Prázdný Exception.StackTrace

Při použití vnitrofiremní knihovny pro logování v Net aplikacích jsem se dostal do problému, kdy se zpráva logovala do databáse. V tomto případě SQL Server 2000. Při hledání řešení jsem narazil na několik chyb. Zde musím říci, že je mimo mou moc něco změnit v této knihovně. Což mě nečiní moc šťastným, spíše naopak.
Chybou bylo, že pokud byla nějaká vstupní hodnota rovna null, v mém případě StackTrace z Exception objektu, tak to padalo jemně na pusu. Důvodem je, že SQL Server neakceptuje null hodnotu tak jak ji interpretuje Dot.Net. Musí se provést test hodnoty na null hodnotu a pokud je object roven null, musí se přiřadit jiná null hodnota, které SQL Server rozumí. V tomto případě System.DBNull.Value.

Tento problém se dal ještě řešit na úrovni SQL serveru a to přiřazením default NULL hodnoty pro vstupní parametr v insertovací stored proceduře. Pak to projde i bez změn v logovací knihovně. Tedy něco jako
CREATE PROCEDURE dbo.insert_errorlog
@errormessage nvarchar(500) = NULL,
@errorsource nvarchar(100) = NULL,
@stacktrace nvarchar(300) = NULL,
as ...
Zajímavostí, které mě ale nejvíce zaujala jest zjištění, že na to aby se naplnil StackTrace v Exception musí být sama Exception vyhozena (vyhozena ... legrační, že). Tedy nestačí ji jen vytvořit pomocí new konstrukce ale musí se použít navíc i throw konstrukce. Viz příklad.

[codebox]static void Main(string[] args)
{
UserFriendlyException exc = new UserFriendlyException("test");
Console.WriteLine("1. Exception created");
Console.WriteLine(string.Format("Reading Stacktrace: {0}",exc.StackTrace));

try
{
Console.WriteLine("2. Exception thrown");
throw exc;
}
catch (UserFriendlyException ex)
{
Console.WriteLine("3. Exception caught as UserFriendlyException");
Console.WriteLine(string.Format("Reading Stacktrace: {0}",ex.StackTrace));
}
catch(Exception ex)
{
Console.WriteLine("4. Exception caught as Exception");
Console.WriteLine(string.Format("Reading Stacktrace: {0}",ex.StackTrace));
}
Console.WriteLine("**************************");
Console.WriteLine("Press any key to close it.");
Console.ReadLine();
}[/codebox]

Věc se má vlastně tak, že jsem se snažil přijít na to, jak bych mohl nastavit nějakou hodnotu do StackTrace vlastnosti. Bohužel StackTrace má pouze Getter a nelze ho vložit jako input parametr do konstruktoru, takže zde není šance jak ho nastavit z venku.
Btw. podobná situace je s další Exception vlastností a to je Source, ale ten jde naštěstí nastavit, jelikož má i Setter.

Source: [attachment=162:ExceptionTest.zip]


Nový komentář