Exceptii in C# - cele mai populare intrebari legate de exceptii

Probleme cu exceptii de la interviuri

Posted by anghelvalentin on September 04, 2019

Cred ca nu am fost vreodata la vreun interviu la care sa nu primesc o intrebare despre exceptii. Mi se pare si logic sa primesc astfel de intrebari, cu exceptiile te lovesti zi de zi si trebuie sa stii cum functioneaza, ce te intereseaza despre ele si ce sa faci cu ele. Intrebarile de mai jos sunt de bun simt, asa ca trebuie sa stii raspunsurile.

  1. Ce informatii te intereseaza de la o exceptie? Proprietatea Message, StackTrace si InnerException in caz ca are. Proprietatea InnerException este in foarte multe cazuri foarte importanta, intrucat exceptia care ne intereseaza este impachetata in alte exceptii: exceptiile SQL sunt astfel impachetate.

  2. Care este diferenta dintre throw, throw e; si throw new Exception(message,exception) ? Diferenta e la stacktrace: in cazul throw simplu, stacktrace-ul este pastrat, in cazul throw e, stacktrace este de unde a fost apelat throw e. Cand facem throw new Exception(message, exception), exceptia noastra este impachetata intr-o alta exceptia. Astfel, ea devine un inner exception.

static float Divide(int a,int b)
{
	return a/b;

}

static void Calculate()
{
	try
	{
		Divide(10,0);
	}
	catch (DivideByZeroException e)
	{
		//comment one by one
		throw; //stacktrace from Divide
		throw e;  //stacktrace from here
		throw new Exception("",e);
	}
}

static void Main(string[] args)
{
	try
	{
		Calculate();
	}
	catch (DivideByZeroException ex)
	{
		Console.Error.WriteLine(ex.StackTrace);
	}
	catch (Exception ex)
	{
		Console.Error.WriteLine(ex.StackTrace); // In this case, we have innner exception
	}
}
  1. O problema interesanta pe care am primit-o de la o firma ruseasca care tot incearca disperati sa angajeze oameni. Ce mesaj se afiseaza ?
try
{
	try
	{
		throw new Exception("Exception try");
	}
	catch (Exception e)
	{
		throw new Exception("Exception catch");
	}
	finally
	{
		throw new Exception("Exception finally");
	}
}
catch (Exception e)
{
	Console.WriteLine(e.Message); 
}

Codul sursa