C# dilinde istisnaları nasıl oluşturup fırlatacağınızı inceleyin.
- 16 dakika
.NET, temel sınıftan türetilen özel durum sınıflarının hiyerarşisini System.Exception sağlar. C# uygulamaları, herhangi bir istisna türünde istisnalar oluşturabilir ve fırlatabilir. Geliştiriciler ayrıca özellik değerleri atayarak özel durum nesnelerini uygulamaya özgü bilgilerle özelleştirebilir.
Uyarı
Bu modül, özel durumlar oluşturma ve fırlatma ve özel durum nesnelerini özelleştirme üzerine odaklanır. Özel özel durum sınıfları oluşturmak bu modülün kapsamı dışındadır.
Özel durum nesnesi oluşturma
Kodunuzun içinden özel durumlar oluşturma ve atma, C# programlamanın önemli bir yönüdür. Belirli bir koşula, soruna veya hataya yanıt olarak özel durum oluşturabilmek, uygulamanızın kararlılığını sağlamanıza yardımcı olur.
Oluşturduğunuz özel durum türü, kodlama sorununa bağlıdır ve özel durumun amaçlanan amacına mümkün olduğunca yakından eşleşmelidir.
Örneğin, veri analizi gerçekleştiren adlı GraphData bir yöntem oluşturduğunuzu varsayalım. yöntemi bir veri dizisini giriş parametresi olarak alır. yöntemi, giriş verilerinin belirli bir aralıkta olmasını bekliyor. Yöntem, beklenen aralığın dışında bir veri alırsa, ArgumentException türünde bir özel durum oluşturur ve fırlatır. Özel durum, çağrı yığınının bir yerinde verileri sağlamakla sorumlu olan kod tarafından işlenir.
Özel durum oluştururken kullanabileceğiniz bazı yaygın özel durum türleri şunlardır:
-
ArgumentExceptionveyaArgumentNullException: Bir yöntem veya oluşturucu geçersiz bir bağımsız değişken değeri veya null başvuru ile çağrıldığında bu özel durum türlerini kullanın. -
InvalidOperationException: Bir yöntemin çalışma koşulları belirli bir yöntem çağrısının başarıyla tamamlanmasını desteklemediğinde bu özel durum türünü kullanın. -
NotSupportedException: Bir işlem veya özellik desteklenmediğinde bu özel durum türünü kullanın. -
IOException: Giriş/çıkış işlemi başarısız olduğunda bu özel durum türünü kullanın. -
FormatException: Bir dizenin veya verilerin biçimi yanlış olduğunda bu özel durum türünü kullanın.
new anahtar sözcüğü bir özel durumun örneğini oluşturmak için kullanılır. Örneğin, aşağıdaki gibi özel durum türünün bir örneğini ArgumentException oluşturabilirsiniz:
ArgumentException invalidArgumentException = new ArgumentException();
Özelleştirilmiş özel durumları yapılandırma ve yollama
Özel durum nesnesi oluşturma işlemi, özel durum türetilmiş bir sınıfın örneğini oluşturmayı, isteğe bağlı olarak özel durumun özelliklerini yapılandırmayı ve sonra anahtar sözcüğünü throw kullanarak nesneyi oluşturmayı içerir.
Bir istisna fırlatılmadan önce bağlamsal bilgilerle özelleştirmek genellikle faydalıdır. Özel durum nesnesinin özelliklerini yapılandırarak uygulamaya özgü bilgiler sağlayabilirsiniz. Örneğin, aşağıdaki kod, kendisine özel bir invalidArgumentException özelliği verilen Message adlı bir özel durum nesnesi oluşturur ve ardından bu özel durumu fırlatır.
ArgumentException invalidArgumentException = new ArgumentException("ArgumentException: The 'GraphData' method received data outside the expected range.");
throw invalidArgumentException;
Uyarı
Bir istisnanın Message özelliği salt okunurdur. Bu nedenle, nesne örneği oluştururken özel Message bir özellik ayarlanmalıdır.
Özel durum nesnesini özelleştirirken, sorunu ve nasıl çözüleceğini açıklayan net hata iletileri sağlamak önemlidir. Ayrıca, kullanıcıların sorunu düzeltmesine yardımcı olmak için yığın izlemeleri ve hata kodları gibi ek bilgiler de ekleyebilirsiniz.
Özel durum nesnesi doğrudan bir throw deyimi içinde de oluşturulabilir. Örneğin:
throw new FormatException("FormatException: Calculations in process XYZ have been cancelled due to invalid data format.");
Özel durum oluştururken dikkat edilmesi gereken bazı noktalar şunlardır:
- "
Messageözelliği istisnanın nedenini açıklamalıdır." Ancak, hassas veya güvenlikle ilgili bir sorunu temsil eden bilgiler ileti metnine yerleştirilmemelidir. -
StackTraceözelliği genellikle özel durumun kaynağını izlemek için kullanılır. Bu dize özelliği, geçerli çağrı yığınındaki yöntemlerin adını ve özel durumla ilişkili her yöntemdeki dosya adını ve satır numarasını içerir. BirStackTracenesne, ortak dil çalışma zamanı (CLR) tarafındanthrowdeyiminden itibaren otomatik olarak oluşturulur. Yığın izlemesinin başlaması gereken noktadan özel durumlar oluşturulmalıdır.
Ne zaman istisna fırlatılır?
Yöntemler, amaçlanan amacını tamamlayamadıklarında bir istisna fırlatmalıdır. Atılan istisna, hata koşullarına uyan en belirgin istisna türüne dayanmalıdır.
Bir geliştiricinin iş süreci uygulayan bir uygulama üzerinde çalıştığı bir senaryo düşünün. İş süreci kullanıcı girişlerine bağlıdır. Giriş beklenen veri türüyle eşleşmiyorsa, iş sürecini uygulayan yöntem bir özel durum oluşturur ve atar. Özel durum nesnesi, özellik değerlerinde uygulamaya özgü bilgilerle yapılandırılabilir. Aşağıdaki kod örneği senaryoyu gösterir:
string[][] userEnteredValues = new string[][]
{
new string[] { "1", "two", "3"},
new string[] { "0", "1", "2"}
};
foreach (string[] userEntries in userEnteredValues)
{
try
{
BusinessProcess1(userEntries);
}
catch (Exception ex)
{
if (ex.StackTrace.Contains("BusinessProcess1") && (ex is FormatException))
{
Console.WriteLine(ex.Message);
}
}
}
static void BusinessProcess1(string[] userEntries)
{
int valueEntered;
foreach (string userValue in userEntries)
{
try
{
valueEntered = int.Parse(userValue);
// completes required calculations based on userValue
// ...
}
catch (FormatException)
{
FormatException invalidFormatException = new FormatException("FormatException: User input values in 'BusinessProcess1' must be valid integers");
throw invalidFormatException;
}
}
}
Bu kod örneğinde, üst düzey ifadeler, kullanıcı tarafından girilen değerleri içeren bir dize dizisini geçirerek BusinessProcess1 yöntemini çağırır. yöntemi, BusinessProcess1 tamsayıya dönüştürülebilecek kullanıcı giriş değerlerini bekler. Yöntem, geçersiz bir biçime sahip verilerle karşılaştığında, özelleştirilmiş bir FormatException özelliği kullanarak Message özel durum türünden bir örnek oluşturur. Daha sonra yöntem, istisnayı fırlatır. Özel durum, ex olarak adlandırılan bir nesne şeklinde üst düzey ifadelerde yakalanıyor. Nesnenin ex özellikleri, kullanıcıya özel durum iletisi görüntülenmeden önce incelenir. İlk olarak kod, "BusinessProcess1" içerip içermediğini görmek için özelliğini inceler StackTrace . İkincisi, özel durum nesnesinin ex türünde FormatExceptionolduğu doğrulanır.
Özel durumları yeniden oluşturma
Yeni bir özel durum oluşturmanın yanı sıra, throw bir kod bloğunun içinden catch bir özel durumu yeniden oluşturmak için kullanılabilir. Bu durumda, throw bir özel durum operandı almaz.
catch (Exception ex)
{
// handle or partially handle the exception
// ...
// re-throw the original exception object for further handling down the call stack
throw;
}
Bir özel durumu yeniden oluştururken özgün özel durum nesnesi kullanılır, bu nedenle özel durum hakkında hiçbir bilgi kaybetmezsiniz. Özgün hatayı kapsayan yeni bir özel durum nesnesi oluşturmak istiyorsanız, özgün hatayı yeni özel durum nesnesinin kurucusuna bir bağımsız değişken olarak geçirebilirsiniz. Örneğin:
catch (Exception ex)
{
// handle or partially handle the exception
// ...
// create a new exception object that wraps the original exception
throw new ApplicationException("An error occurred", ex);
}
"BusinessProcess1" uygulama senaryosu için aşağıdaki güncelleştirmeleri göz önünde bulundurun:
-
BusinessProcess1yöntemi ek ayrıntıları içerecek şekilde güncelleştirildi.BusinessProcess1şimdi iki sorunla karşılaşır ve her sorun için özel durumlar oluşturması gerekir. - Üst düzey ifadeler güncellendi. Üst düzey deyimler artık
OperatingProcedure1metodunu çağırmaktadır.OperatingProcedure1birBusinessProcess1kod bloğu içinde çağrılartry. -
OperatingProcedure1yöntemi, özel durum türlerinden birini işleyebilir ve diğerini kısmen işleyebilir. Kısmen işlenen özel durum işlendikten sonra, özgün özel durumuOperatingProcedure1yeniden fırlatması gerekir.
Aşağıdaki kod örneği güncelleştirilmiş senaryoyu gösterir:
try
{
OperatingProcedure1();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine("Exiting application.");
}
static void OperatingProcedure1()
{
string[][] userEnteredValues = new string[][]
{
new string[] { "1", "two", "3"},
new string[] { "0", "1", "2"}
};
foreach(string[] userEntries in userEnteredValues)
{
try
{
BusinessProcess1(userEntries);
}
catch (Exception ex)
{
if (ex.StackTrace.Contains("BusinessProcess1"))
{
if (ex is FormatException)
{
Console.WriteLine(ex.Message);
Console.WriteLine("Corrective action taken in OperatingProcedure1");
}
else if (ex is DivideByZeroException)
{
Console.WriteLine(ex.Message);
Console.WriteLine("Partial correction in OperatingProcedure1 - further action required");
// re-throw the original exception
throw;
}
else
{
// create a new exception object that wraps the original exception
throw new ApplicationException("An error occurred - ", ex);
}
}
}
}
}
static void BusinessProcess1(string[] userEntries)
{
int valueEntered;
foreach (string userValue in userEntries)
{
try
{
valueEntered = int.Parse(userValue);
checked
{
int calculatedValue = 4 / valueEntered;
}
}
catch (FormatException)
{
FormatException invalidFormatException = new FormatException("FormatException: User input values in 'BusinessProcess1' must be valid integers");
throw invalidFormatException;
}
catch (DivideByZeroException)
{
DivideByZeroException unexpectedDivideByZeroException = new DivideByZeroException("DivideByZeroException: Calculation in 'BusinessProcess1' encountered an unexpected divide by zero");
throw unexpectedDivideByZeroException;
}
}
}
Güncelleştirilmiş örnek kod aşağıdaki çıkışı oluşturur:
FormatException: User input values in 'BusinessProcess1' must be valid integers
Corrective action taken in OperatingProcedure1
DivideByZeroException: Calculation in 'BusinessProcess1' encountered an unexpected divide by zero
Partial correction in OperatingProcedure1 - further action required
DivideByZeroException: Calculation in 'BusinessProcess1' encountered an unexpected divide by zero
Exiting application.
Özel durumları fırlatırken kaçınılması gerekenler
Aşağıdaki liste, özel durumlar oluştururken kaçınılması gereken uygulamaları tanımlar:
- Normal yürütmenin bir parçası olarak bir programın akışını değiştirmek için özel durumlar kullanmayın. Hata koşullarını raporlamak ve işlemek için özel durumları kullanın.
- Özel durumlar, fırlatılmak yerine dönüş değeri veya parametre olarak döndürülmemelidir.
- Kendi kaynak kodunuzdan kasıtlı olarak
System.Exception,System.SystemException,System.NullReferenceExceptionveyaSystem.IndexOutOfRangeExceptionatmayın. - Hata ayıklama modunda atılabilecek ancak dağıtım modunda atılamayacak istisnalar oluşturmayın. Geliştirme aşamasındaki çalışma zamanı hatalarını belirlemek için bunun yerine
Debug.Assertkullanın.
Uyarı
Debug.Assert yöntemi, geliştirme sırasında mantık hatalarını yakalamaya yönelik bir araçtır. Varsayılan olarak, Debug.Assert yöntemi yalnızca hata ayıklama derlemelerinde çalışır. Hata ayıklama oturumlarında hiçbir zaman gerçekleşmemesi gereken bir koşulu denetlemek için kullanabilirsiniz Debug.Assert . yöntemi iki parametre alır: denetlenecek Boole koşulu ve koşul falseise görüntülenecek isteğe bağlı dize iletisi.
Debug.Assert kodunuzun normal yürütülmesi sırasında olağanüstü durumları işlemenin bir yolu olan özel durum oluşturma yerine kullanılmamalıdır. Hiçbir zaman gerçekleşmemesi gereken hataları yakalamak için ve Debug.Assert programınızın normal yürütülmesi sırasında oluşabilecek hataları işlemek için özel durumları kullanmanız gerekir.
Özet
Bu ünitede hatırlamanız gereken birkaç önemli şey şunlardır:
- Bir istisna oluşturma ve fırlatma sırasında, istisna türünün, istisnanın amaçlanan amacıyla mümkün olduğunca yakın eşleşmesi gerekir.
- Bir özel durumu ele almak için, özel durumdan türetilmiş bir sınıfın bir örneğini oluşturur, özelliklerini yapılandırır ve ardından
throwanahtar sözcüğünü kullanırsınız. - Özel durum nesnesi oluştururken, kullanıcıların sorunu düzeltmesine yardımcı olmak için net hata iletileri ve ek bilgiler sağlamak önemlidir.