Anonymní profil manro – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil manro – Programujte.comAnonymní profil manro – Programujte.com

 

Příspěvky odeslané z IP adresy 85.159.107.–

manro
.NET › Logovanie vynimiek
8. 10. 2010   #134362

Nikto nic, tak si odpoviem sam, mozno sa to dakomu zide:

Do triedy Program je potrebne pridat handler na odchytavanie vsetkych neosetrenych vynimiek, nieco ako:



[STAThread]
static void Main()
{
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new App());
}

public static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
Logger log = new Logger(e.Exception);
}


V triede Logger, ktorej instancia sa vytvara vzdy pri zachyteni neosetrenej vynimky sa vynimka spracuje, nieco ako:


public class Logger
{
public Logger(Exception exception)
{
DialogResult result = DialogResult.Abort;
try
{
result = MessageBox.Show("Hups. Neosetrena chyba!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);

StringBuilder error = new StringBuilder();

error.AppendLine("Aplikácia: " + Application.ProductName);
error.AppendLine("Verzia: " + Application.ProductVersion);
error.AppendLine("Dátum a čas: " + DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss"));
error.AppendLine("Názov počítača: " + SystemInformation.ComputerName);
error.AppendLine("Užívateľ: " + SystemInformation.UserName);
error.AppendLine("OS: " + Environment.OSVersion.ToString());
error.AppendLine("Regionálne nastavenie: " + CultureInfo.CurrentCulture.Name);
error.AppendLine("Rozlíšenie: " + SystemInformation.PrimaryMonitorSize.ToString());
error.AppendLine("Čas behu systému: " + GetSystemUpTime());
error.AppendLine("Čas behu aplikácie: " + (DateTime.Now - Process.GetCurrentProcess().StartTime).ToString());

error.AppendLine("");

error.AppendLine("Trieda výnimky: ");
error.Append(GetExceptionTypeStack(exception));
error.AppendLine("");
error.AppendLine("Správa výnimky: ");
error.Append(GetExceptionMessageStack(exception));

error.AppendLine("");
error.AppendLine("Stack Traces:");
error.Append(GetExceptionCallStack(exception));

if (!Directory.Exists("./chyby"))
Directory.CreateDirectory("./chyby");

using (TextWriter tw = new StreamWriter("./chyby/" + DateTime.Now.ToString("dd-MM-yyyy--HH-mm-ss") + ".txt"))
{
tw.Write(error);
}
}
finally
{
if (result == DialogResult.Abort)
{
Application.Exit();
}
}
}

private static TimeSpan GetSystemUpTime()
{
PerformanceCounter upTime = new PerformanceCounter("System", "System Up Time");
upTime.NextValue();
return TimeSpan.FromSeconds(upTime.NextValue());
}

private static string GetExceptionTypeStack(Exception e)
{
if (e.InnerException != null)
{
StringBuilder message = new StringBuilder();
message.AppendLine(GetExceptionTypeStack(e.InnerException));
message.AppendLine(" " + e.GetType().ToString());
return (message.ToString());
}
else
{
return " " + e.GetType().ToString();
}
}

private static string GetExceptionMessageStack(Exception e)
{
if (e.InnerException != null)
{
StringBuilder message = new StringBuilder();
message.AppendLine(GetExceptionMessageStack(e.InnerException));
message.AppendLine(" " + e.Message);
return (message.ToString());
}
else
{
return " " + e.Message;
}
}

private static string GetExceptionCallStack(Exception e)
{
if (e.InnerException != null)
{
StringBuilder message = new StringBuilder();
message.AppendLine(GetExceptionCallStack(e.InnerException));
message.AppendLine("--- Next Call Stack:");
message.AppendLine(e.StackTrace);
return (message.ToString());
}
else
{
return e.StackTrace;
}
}
}


Vytvori sa subor obsahujuci popis chyby spolu so stack trace informaciami ako napriklad riadok kodu, ktory vynimku vyvolal. Tieto chybove subory viete napr. automaticky zbalit do archivu a odoslat na svoj mail.

manro
.NET › -Prosím, počkajte...- dialog
17. 6. 2010   #130347

Neda mi nepodelit sa s mojim riesenim tzv. waiting dialogu. Nikde inde som zatial nevidel jednoduchsie a elegantnejsie riesenie, ak existuje, dajte vediet...

Definicia samotnej triedy okna:



public class WaitingForm : Form
{
public WaitingForm ()
{
InitializeComponent();
Thread th = new Thread(new ThreadStart(() =>
{
this.TopMost = true;
this.ShowDialog();
}));

th.Start();
}

protected override void Dispose(bool disposing)
{
this.Invoke(new MethodInvoker(() =>
{
base.Dispose(disposing);
}));
}
}


samotne pouzitie:


using(WaitingForm cakaj = new WaitingForm ())
{
//dlha operacia
Thread.Sleep(5000);
}


v samotstatnom vlakne sa vykonava zobrazovanie okna a nie beh dlhej operacie vzhladom k problemom v medzivlaknovej komunikacii...

tak co poviete?

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý