yoklateknik mülakat

Backend Csharp Exceptions Mülakat Soruları

75 doğrulanmış Backend Csharp Exceptions mülakat sorusu — cevaplarıyla çöz, açıklamalarıyla öğren, gerçek simülasyonda kendini test et.

Gerçek simülasyonu dene →

Örnek sorular

Csharp ExceptionsZorluk 1
try
{
    Console.WriteLine("A");
    throw new InvalidOperationException();
}
finally
{
    Console.WriteLine("B");
}

Bu kod bloğundan exception dışarı yayılmadan önce (üst seviyede hiçbir şey yakalamadığını varsayarak) ne yazdırılır?
  • aÖnce B sonra A
  • bÖnce A sonra B
  • cYalnızca A (catch olmadığı için finally atlanır)
  • dYalnızca B (exception fırlatıldığı için A tamponlanır ve kaybolur)
Açıklama:try bloğu önce çalışır, "A"yı yazdırır, sonra fırlatır. Exception çağrı yığınında yukarı yayılmadan önce finally bloğu her zaman çalışır ve "B"yi yazdırır. Ancak bundan sonra exception yayılmaya devam eder.
Csharp ExceptionsZorluk 2
try
{
    File.ReadAllText("data.txt");
}
catch (Exception e)
{
    Console.WriteLine("generic: " + e.Message);
}
catch (FileNotFoundException e)
{
    Console.WriteLine("specific: " + e.Message);
}

Bunu derlemeye çalıştığınızda ne olur?
  • aSorunsuz derlenir; FileNotFoundException bloğu runtime'da sadece erişilemez olur ama hata vermez, çünkü derleyici erişilemez dalları üretilen IL'den basitçe yeniden düzenler
  • bSorunsuz derlenir ve derleyici catch bloklarını özgüllüğe göre otomatik yeniden sıraladığı için FileNotFoundException önce yakalar, oysa catch blokları normalde kaynak kodda yazıldıkları sırayla katı biçimde eşleştirilir
  • cYalnızca gerçekten bir FileNotFoundException fırlatıldığında runtime hatası verir; derleyici bu sıralama sorununu tespit edemez, ve bu sıralama hatası gerçekleşene kadar production'a sessizce fark edilmeden gider
  • dDerleme zamanı hatası: daha genel bir catch clause'u (Exception), daha özgül olandan (FileNotFoundException) önce geliyor, C# buna izin vermez çünkü özgül catch asla erişilemez olurdu
Açıklama:C#, catch clause'larının en özgülden en genele sıralanmasını gerektirir. FileNotFoundException, Exception'dan türediği için catch (Exception)'ı önce koymak sonraki catch (FileNotFoundException)'ı erişilemez yapar ve derleyici bunu sessizce ölü koda izin vermek yerine derleme zamanı hatasıyla reddeder.
Csharp ExceptionsZorluk 2
.NET exception sınıf hiyerarşisi hakkında hangi ifade doğrudur?
  • aException, hiyerarşinin köküdür; SystemException ve ApplicationException'ın ikisi de Exception'ın alt sınıflarıdır ve özel exception'lar için modern konvansiyon, ApplicationException yerine doğrudan Exception'dan türetmektir
  • bTüm exception'lar SystemException'dan türemelidir; doğrudan Exception'dan türemeye izin verilmez ve doğrudan Exception'dan bir sınıf türetmeye çalışmak derleyici tarafından hata ile reddedilir
  • cApplicationException, tüm özel, kullanıcı tanımlı exception'ların türemesi gereken kök sınıftır bazı diğer nesne yönelimli dillerde java.lang.Throwable'ın exception'ları çıpaladığı gibi
  • dYalnızca CLR'nin kendisinin fırlattığı exception'lar Exception'dan türeyebilir; kullanıcı tanımlı exception'lar bunun yerine IException arayüzünü uygulamalıdır bazı diğer framework'lerin exception'ların bir marker arayüzü uygulamasını gerektirdiği tasarımı andırarak
Açıklama:Exception, tüm hiyerarşinin temel sınıfıdır. SystemException (çoğunlukla) runtime/BCL tarafından tanımlanan exception'lar için kullanılır; ApplicationException aslında kullanıcı tanımlı exception'lar için düşünülmüştü ama kullanımı artık özel exception tiplerini doğrudan Exception'dan türetmek lehine önerilmiyor.
Csharp ExceptionsZorluk 1
Bir try/catch/finally bloğunda, finally bloğu ne zaman çalışır?
  • aYalnızca bir exception fırlatılıp eşleşen bir catch bloğu tarafından yakalanırsa ve çevreleyen metodu aşarak yayılan exception'lar için finally tamamen atlanır
  • bYalnızca hiç exception fırlatılmazsa ki bu finally'yi try/catch bloğundan sonra kod yazmakla işlevsel olarak gereksiz kılardı
  • cHer zaman, exception fırlatılmış olsun ya da olmasın, yakalanmış olsun ya da olmasın
  • dYalnızca o try için bir catch bloğu yoksa ki bu yaygın bir yanlış anlamadır çünkü finally aslında catch olup olmamasından tamamen bağımsızdır
Açıklama:finally'nin tüm amacı, exception oluşmuş olsun, yakalanmış olsun ya da blok normal şekilde return ile çıkmış olsun, try/catch'ten çıkarken koşulsuz olarak çalışmasıdır.
Csharp ExceptionsZorluk 2
try
{
    DoWork();
}
catch (Exception ex)
{
    Console.WriteLine("general: " + ex.Message);
}
catch (InvalidOperationException ex)
{
    Console.WriteLine("specific: " + ex.Message);
}

Bu kod derlendiğinde ne olur?
  • aSorunsuz derlenir ve InvalidOperationException catch bloğu bu spesifik exception her fırlatıldığında çalışır
  • bDerleme hatası (CS0160): InvalidOperationException catch bloğu erişilemez, çünkü üstündeki Exception catch bloğu InvalidOperationException dahil her exception tipini zaten yakalıyor
  • cDerlenir, ama InvalidOperationException catch bloğu ölü koddur ve derleyici bunu çalışma zamanında hatasız/uyarısız sessizce yok sayar
  • dInvalidOperationException ilk fırlatıldığında "unreachable catch clause" runtime hatası verir
Açıklama:C#, catch bloklarının en spesifikten en genele doğru sıralanmasını zorunlu kılar. InvalidOperationException, Exception'dan türediği için, catch(Exception) bloğu catch(InvalidOperationException)'dan önce yerleştirilirse ikinci blok erişilemez hale gelir — derleyici bunu runtime hatası olarak değil, CS0160 derleme hatası olarak reddeder.
Csharp ExceptionsZorluk 3
void Process()
{
    using var r = new Resource();
    Console.WriteLine("working");
    if (DateTime.Now.Ticks % 2 == 0)
        return;
    Console.WriteLine("more work");
}

using bloğu yerine C# 8 "using declaration" (parantezsiz) kullanıldığında, r.Dispose() ne zaman çağrılır?
  • aKapanış parantezinden mi yoksa erken bir return'den mi çıkılsın, çevreleyen bloğun (burada, metodun) sonunda
  • bDeklare edildiği satırdan hemen sonra, "working" yazdırılmadan önce çünkü C#, using declaration'ları scope çıkışında değil kendi ifadesinin bulunduğu noktada hevesle değerlendirir
  • cYalnızca metot normal şekilde son kapanış parantezine ulaştığında; erken bir return dispose'u atlar ki bu using declaration'ları aynı kodu saran istiflenmiş using bloklarından farklı davranmaya iterdi
  • dOtomatik olarak asla — using declaration'lar dispose'u tetiklemek için açık, parantezli bir using bloğu gerektirir ki bu using anahtar kelimesini parantezsiz yazmayı zaten anlamsız kılardı
Açıklama:Bir using declaration, dispose'u belirli bir satıra değil, çevreleyen scope'un (bu durumda metot gövdesinin) sonuna bağlar. Metot son parantezinden mi yoksa erken bir return'den mi çıksın, tıpkı metodun geri kalanını saran bir using bloğu gibi tetiklenir.

3300 soruluk Backend bankasında kendini sına.

Mülakata başla