Существует по крайней мере один случай, когда я думаю, что Вам, вероятно, придется поймать throwable или универсальное исключение - при выполнении отдельного потока для выполнения задачи, можно хотеть знать, поймал ли метод "выполнения" потока некоторое исключение или нет. В этом случае Вы, вероятно, сделаете что-то вроде этого:
public void run() {
try {
...
}
catch(Throwable t) {
threadCompletionError = t;
}
}
я действительно не уверен, является ли это лучший подход, но это работает. И у меня была ошибка "ClassNotFound", будучи повышенным JVM, и это - ошибка и не исключение. Если я позволяю исключению, брошены, я не уверен, как поймать его в вызывающем потоке (вероятно, существует метод, но я не знаю об этом - еще).
Что касается метода ThreadDeath, не называйте "Thread.stop ()" методом. Назовите Thread.interrupt и имейте Ваш поток, чтобы проверить, был ли он прерван кем-то.
I usually don't try to plug products I'm involved in, but this is a perfect problem to be solved by Vici Parser (open source expression parser for .NET):
var parser = new CSharpParser();
var context = new CSharpContext();
context["car"] = carobject;
string brandNameOfCar =
parser.Evaluate<string>("car.brand.name.ToFormatedString()", context);
I didn't test this, but here's something that should work:
car c = new car();
object val = typeof(car).GetField("carbrand", BindingFlags.Private).GetValue(c);
string result = (val as brand).ToFormattedString();
Typeof(car).GetProperty("brand", bindingflags.instance | bindingflags.private).GetValue(carobject,null) should so it. Sry for minor syntax errors bit im on my phone
edit: the above Will give you the brand object and you Can the dó the same to get to the name property
Было бы разумнее иметь конструктор car, который принимает строку в качестве параметра и делает что-то вроде следующего:
class brand
{
public string name;
}
class car
{
public car(string s)
{
Match match = Regex.Match(s, @"(?<carname>[^\.]+)\.(?<brandname>.+)");
if (match.Success)
{
this.carname = match.Groups["carname"].Value;
this.carbrand = new brand();
this.carbrand.name = match.Groups["brandname"].Value;
} else
{
throw new ArgumentException("Not a valid car");
}
}
string carname;
brand carbrand;
public override string ToString()
{
return carname + "." + carbrand.name;
}
}
При следующем использовании:
car c = new car("M5.BMW");
Console.WriteLine(c.ToString());
Вы могли бы, конечно, разделите его на методы Parse и TryParse.