06 December 2022

Catch Throw

Have you ever wondered why ocasionally you can find some code along the lines of:

try
{
    SomeFancyThing();
} 
catch 
{
    throw;
}

On the face of it, it is a noop. It doesn’t wrap the exception into a new, more likable, one. It doesn’t prevent propagating of the exception. It doesn’t even log the exception. So, it does the same (ok, it also slows the execution down a little bit) as just writing

SomeFancyThing();

However, when lines of code are taken into account, things change dramatically. Instead of one line code, there is eight… 🤔 So, if productivity is measured by contributed LoC one can dramatically improve productivity by using this approach.

More weirdness

Worse, ofcourse, are

try
{
    SomeFancyThing();
} 
catch 
{
    
}

and

try
{
    SomeFancyThing();
} 
catch (Exception e)
{
    throw e;
}

In first example, at least log the exception so you know something bad happened. In second, stack trace is destroyed.

And still more

try
{
    SomeFancyThing();
} 
catch (Exception e)
{
    throw new MyFancyException(e.Message);
}

I have a gut feeling this somehow originates from Java. Or it’s forced by some team agreement on wrapping all exceptions. Then at least make it

throw new MyFancyException(e);

when throwing to preserve the original exception. You’ll thank yourself later.

07 August 2022

Delete Deeply Nested Directories

On Windows.

The problem

Deeply nested directories are sometimes created during the course of software development. Imagine NPM packages, or C# solution with bin\debug directories and dlls named after project name. It quickly adds up. Issue is exacerbated with tendency of (some) development tools to suggest user dir as a home for new stuff. As a result we get a file path like C:\Users\user.name\source\project\MyAwesomeCompany.MyAwesomeProduct\MyAwesomeCompany.MyAwesomeProduct.Repository.Interface\bin\debug\MyAwesomeCompany.MyAwesomeProduct.Repository.Interface.dll

With even more creative names hitting the maximum path length of 260 characters is within reach :)

Deleting such path can prove difficult as doing it from Windows Explorer fails. Sometimes, a directory near the root can be renamed to one character which then helps with the delete. Sometimes, that does not work either.

Robocopy

One approach that consistently works and does not depend on third party utilities is using robocopy:

  1. create an empty directory, e.g. c:\temp
  2. open command prompt
  3. copy and paste the following command, replacing the example directory with the one you want to delete:
robocopy c:\temp C:\Users\user.name\source\project\MyAwesomeCompany.MyAwesomeProduct /mir

Essentially, it tells robocopy to mirror the source directory onto the destination. Since the source is empty, it will delete everything in the destination. And it will do that quickly.

Bonus tip - if there is space somewhere in problem directory path, double quotes can be used:

robocopy c:\temp "C:\Users\user with a space\source\project\MyAwesomeCompany.My Awesome Product" /mir

23 July 2021

java.lang.UnsatisfiedLinkError: No implementation found for long com.android.tools.profiler.support.network.HttpTracker$Connection.nextId()

Check whether Database inspector is running and stop it. Restart Android Studio. It helped me with:

java.lang.UnsatisfiedLinkError: No implementation found for long com.android.tools.profiler.support.network.HttpTracker$Connection.nextId() (tried Java_com_android_tools_profiler_support_network_HttpTracker_00024Connection_nextId and Java_com_android_tools_profiler_support_network_HttpTracker_00024Connection_nextId__)
 at com.android.tools.profiler.support.network.HttpTracker$Connection.nextId(Native Method)
 at com.android.tools.profiler.support.network.HttpTracker$Connection.<init>(HttpTracker.java:209)
 at com.android.tools.profiler.support.network.HttpTracker$Connection.<init>(HttpTracker.java:201)
 at com.android.tools.profiler.support.network.HttpTracker.trackConnection(HttpTracker.java:294)
 at com.android.tools.profiler.agent.okhttp.OkHttp3Interceptor.trackRequest(OkHttp3Interceptor.java:84)
 at com.android.tools.profiler.agent.okhttp.OkHttp3Interceptor.intercept(OkHttp3Interceptor.java:45)
 at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)