v134 · javascript

Resource Leak Detector

Run the same scenario with manual try/finally vs using and compare leaked vs cleaned resources. When a function throws mid-way, using still disposes every resource in scope — try/finally requires remembering each one individually.

checking using keyword…
The problem: code that opens multiple resources often leaks some on the throw path. try/finally works but only if every resource is referenced in the finally block. using r = openResource() automatically calls r[Symbol.dispose]() on exit — even if the scope throws before the resource is explicitly closed.

Run scenario

Without using (manual)

—
leaked resources

With using

—
leaked resources

Execution log

Click "Run both approaches" to start.

The difference

// Without using — easy to miss resources in finally function processFile(path) { const handle = openFile(path); const lock = acquireLock(path); const logger = openLogger(); try { doWork(handle, lock, logger); // may throw return result; } finally { handle.close(); // if lock.release() above throws, logger leaks lock.release(); // ← forgot logger.close() ! } } // With using — every resource disposed automatically, LIFO function processFile(path) { using handle = openFile(path); using lock = acquireLock(path); using logger = openLogger(); doWork(handle, lock, logger); // throws? all three close return result; // ← Symbol.dispose called on logger, lock, handle (LIFO) }