SORU
15 EKİM 2008, ÇARŞAMBA


Nasıl önlemek ve ya bir StackOverflowException/yapmalıyım?

Ya önlemek veya XslCompiledTransform için bir telefon alıyorum bir StackOverflowException işlemek istiyorum.Yazıyorum bir Xsl dönüşümü Düzenleyicisi içinde yöntemi. Sorun kullanıcı sonsuz özyinelemeli bir Xsl komut dosyası yazmak olabilir gibi görünüyor, ve belki de bir yöntem Dönüştürme çağrısı üzerine eser. (Bu sorun genelde böyle bir durum neden olan tipik bir programlama hatası değil.)

Bir şekilde nasıl birçok izin verilen tespit ve/veya sınır var mı? Yoksa bana patlayacak bu kod tutmak için başka fikri olan?

CEVAP
15 EKİM 2008, ÇARŞAMBA


Microsoft

İle başlayan .NET Çerçeve sürüm 2.0, bir StackOverflowException bir tarafından yakalanmış olamaz nesne try-catch blok ve ilgili süreç varsayılan olarak sonlandırıldı. Sonuç olarak, kullanıcıların kendi kod yazmak için tavsiye edilir tespit etmek ve bir yığın önlemek taşma. Eğer, örneğin, uygulama özyineleme kullanmak bağlıdır bir sayaç veya bir devlet durumu özyinelemeli bir döngü sona erdirmek.

Özel bir iç, içinde neler olduğunu varsayıyorum .NET yöntem ve kodunuzda değil.

Bir kaç şey yapabilirsiniz.

  • Sonsuz özyineleme için xsl denetler ve bir dönüştürme uygulamadan önce kullanıcı bildiren kod (Ugh) yazma.
  • Ayrı bir işlem içinde Çok kod (Hacky, ama daha az iş) yük.

İşlem sınıfı eğer ölürse uygulamak ayrı bir süreç haline dönüştürmek, ve hatanın kullanıcı uyaracaktır derleme yüklemek için, Ana Uygulama öldürmeden kullanabilirsiniz.

EDİT: ben sadece test edilmiş, bunu yapmak için nasıl burada

MainProcess:

// This is just an example, obviously you'll want to pass args to this.
Process p1 = new Process();
p1.StartInfo.FileName = "ApplyTransform.exe";
p1.StartInfo.UseShellExecute = false;
p1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

p1.Start();
p1.WaitForExit();

if (p1.ExitCode == 1)    
   Console.WriteLine("StackOverflow was thrown");

Süreç ApplyTransform:

class Program
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException  = new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        throw new StackOverflowException();
    }

    // We trap this, we can't save the process, 
    // but we can prevent the "ILLEGAL OPERATION" window 
    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        if (e.IsTerminating)
        {
            Environment.Exit(1);
        }
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • eisleyhead

    eisleyhead

    11 Ocak 2006
  • GenTechPC

    GenTechPC

    1 Temmuz 2007
  • Rockstar Games

    Rockstar Gam

    17 ŞUBAT 2006